クライアント コンピューターのコード ページがデータベースのコード ページと異なる場合、文字データが正しく表されない

元の製品バージョン: 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 データ型をncharnvarchar使用します。

方法 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) であることを前提としています。 コード例のプレースホルダーは、状況に適した値に置き換える必要があります。

この問題を回避するには、次の手順を実行します。

  1. 文字を生データに手動で変換し、データベースのコード ページを使用してデータベースにデータを挿入します。 この操作を行うには、次のようなコード スニペットを使用します。

    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;
    
  2. データに対してクエリを実行する場合は、SQL Server用 Microsoft OLE DB Provider または Microsoft .NET Framework Data Provider for SQL Server を使用してデータベースに接続し、パラメーターを Auto TranslateFalse設定します。 この操作を行うには、次のようなコード スニペットを使用します。

    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False");
    // code for representing the character data;
    

詳細

問題を再現するには、次の手順に従います。

  1. 既定のコード ページとして韓国語 (CP949) が設定されているクライアント コンピューターで、SQL Server Management Studioを開始します。

  2. 既定のコード ページとして英語 (CP1252) を持つデータベースに接続します。

  3. 次のクエリを使用して、データベースにテーブルを作成します。

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. 次のクエリを使用して、韓国語文字をデータベースに挿入します。

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. 次のクエリを使用して、select クエリを作成してデータを取得します。

    SELECT * FROM tbTest
    

次の結果が表示されます。 列 A の値は疑問符です。


A                    NA         Comment
-------------------- ---------- --------------------
?                    가          SQLServer/INSERT

関連情報