クライアント コンピューターのコード ページがデータベースのコード ページと異なる場合、文字データが正しく表されない
元の製品バージョン: SQL Server
元の KB 番号: 904803
現象
次のような状況で問題が発生します。
SQL Server Management Studioを使用して、Unicode 以外のデータ型を使用するSQL Server データベースの文字データに対してクエリを実行します。 たとえば、SQL Server データベースでは、、
varchar
またはtext
データ型がchar
使用されます。クライアント コンピューターのコード ページは、データベースのコード ページとは異なります。 コード ページは、データベースの照合順序に関連付けられています。
このシナリオでは、文字データが正しく表されません。
たとえば、次のいずれかの問題が発生する可能性があります。
文字データは疑問符 (
?
) として表されます。 文字データのクエリを実行する前に、文字データを Unicode 以外のデータ型として挿入または更新すると、この問題が発生する可能性があります。 この問題は、コード ページが異なるクライアント コンピューターでSQL Server Management Studioを使用してこの変更を行った場合に発生します。文字データは、破損したデータとして表されます。 コード ページ X の文字データは、コード ページ Y の Unicode 以外の列に格納されます。さらに、文字データは翻訳されません。 この問題は、SQL Server Management Studioを使用して文字データを照会するときに発生します。
注:
SQL Server Management Studioを使用して文字データを照会する場合、[文字データの変換を実行する] 設定 (パラメーターとも呼ばれます
Auto Translate
) が無効になっている場合、文字データは正しく表されます。 パラメーターはAuto Translate
、microsoft OLE DB Provider for SQL Server および Microsoft .NET Framework Data Provider for OLE DB のプロパティのパラメーターConnectionString
です。
原因
この問題は、コード ページ X の文字データが、サポートされていないコード ページ Y の Unicode 以外の列に格納されているために発生します。
SQL Serverでは、Unicode 以外のデータ型の文字列リテラルを使用すると、データベースの照合順序から派生したデータベースの既定のコード ページを使用して、文字列リテラルが変換されます。 コード ページ X の文字データをコード ページ Y の列に格納すると、データが失われたり、データが破損したりする可能性があります。
文字データが破損データとして表されている場合、データは、Microsoft OLE DB Provider for SQL Server または Microsoft .NET Framework Data Provider for OLE DB のパラメーターを無効にAuto Translate
した場合にのみ、正しく表すことができます。
注:
SQL Server Management Studioでは、microsoft .NET Framework データ プロバイダーを使用して、SQL Serverを使用してSQL Server データベースに接続します。 このデータ プロバイダーでは、 パラメーターは Auto Translate
サポートされていません。
回避策
この問題を回避するには、次のいずれかの方法を使用します。
方法 1: Unicode 以外のデータ型の代わりに Unicode データ型を使用する
コード ページ変換によって発生するすべての問題を回避するために、列を Unicode データ型に変更します。 たとえば、 、、または ntext
データ型をnchar
nvarchar
使用します。
方法 2: データベースに適切な照合順序を使用する
Unicode 以外のデータ型を使用する必要がある場合は、常に、データベースのコード ページと Unicode 以外の列のコード ページが Unicode 以外のデータを正しく格納できることを確認してください。 たとえば、コード ページ 949 (韓国語) の文字データを格納する場合は、データベースに韓国語の照合順序を使用します。 たとえば、データベースの照合順序を Korean_Wansung_CI_AS
使用します。
方法 3: "binary" または "varbinary" データ型を使用する
適切なコード ページ変換を実行せずに処理される文字の正確なバイト値をデータベースに直接格納して取得する場合は、 または varbinary
データ型をbinary
使用します。
方法 4: 別のツールを使用してデータを格納および取得し、"自動翻訳" パラメーターを無効にする
警告
コード ページ X の文字データをコード ページ Y の列に格納することをテストまたはサポートしていません。この操作により、言語的に不適切なクエリ結果、不適切な文字列の一致または順序付け、予期しないコード ページ変換 (データ破損) が発生する可能性があります。 この問題を回避するには、他のいずれかの方法を使用することをお勧めします。
Microsoft OLE DB Provider for SQL Serverを使用して、別のコード ページを持つデータベースに接続し、Unicode 以外のデータ型列から文字データを照会する場合は、翻訳されていない文字をデータベースに格納してください。
注:
次の例では、クライアント コンピューターのコード ページが韓国語 (CP949) であり、SQL Server データベースのコード ページが英語 (CP1252) であることを前提としています。 コード例のプレースホルダーは、状況に適した値に置き換える必要があります。
この問題を回避するには、次の手順を実行します。
文字を生データに手動で変換し、データベースのコード ページを使用してデータベースにデータを挿入します。 この操作を行うには、次のようなコード スニペットを使用します。
string strsrc="가";string strsrc="가"; string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc)); sql="insert into <tablename> (<column>,) values ('" + strtag + "')"; // code for updating the database;
データに対してクエリを実行する場合は、SQL Server用 Microsoft OLE DB Provider または Microsoft .NET Framework Data Provider for SQL Server を使用してデータベースに接続し、パラメーターを
Auto Translate
にFalse
設定します。 この操作を行うには、次のようなコード スニペットを使用します。OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" + " Initial Catalog =<yourdatabase>;"+ "User id=<youruserid>; Password=<yourpassword>;"+ "Auto Translate=False"); // code for representing the character data;
詳細
問題を再現するには、次の手順に従います。
既定のコード ページとして韓国語 (CP949) が設定されているクライアント コンピューターで、SQL Server Management Studioを開始します。
既定のコード ページとして英語 (CP1252) を持つデータベースに接続します。
次のクエリを使用して、データベースにテーブルを作成します。
CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
次のクエリを使用して、韓国語文字をデータベースに挿入します。
INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
次のクエリを使用して、select クエリを作成してデータを取得します。
SELECT * FROM tbTest
次の結果が表示されます。 列 A の値は疑問符です。
A NA Comment
-------------------- ---------- --------------------
? 가 SQLServer/INSERT
関連情報
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示