文字データの自動変換

SQL_C_CHAR で宣言された ANSI 文字変数や、charvarchartext データ型を使用して SQL Server に保存されているデータなどの文字データは、限られた文字数しか表現できません。1 文字ごとに 1 バイトを使用して保存される文字データでは、256 文字しか表現できません。SQL_C_CHAR 変数に格納される値は、クライアント コンピュータの ANSI コード ページ (ACP) を使用して解釈されます。charvarchar、または text データ型を使用してサーバーに格納されている値は、サーバーの ACP を使用して解釈されます。

サーバーとクライアントに同じ ACP がある場合、SQL_C_CHAR、char オブジェクト、varchar オブジェクト、または text オブジェクトに格納されている値の解釈で問題が発生することはありません。サーバーとクライアントの ACP が異なる場合に、クライアントの SQL_C_CHAR データが charvarchar、または text 型の列、変数、パラメータで使用されているときは、サーバーでは別の文字に解釈される可能性があります。たとえば、0xA5 という値の文字バイトは、コード ページ 437 を使用するコンピュータでは Ñ という文字に解釈されますが、コード ページ 1252 を使用するコンピュータでは円記号 (\) として解釈されます。

Unicode データは、1 文字あたり 2 バイトを使用して格納されます。Unicode の仕様は、すべての拡張文字を網羅しています。したがって、すべての Unicode 文字は、すべてのコンピュータで同じ文字に解釈されます。

SQL Server Native Client ODBC ドライバの AutoTranslate 機能は、コード ページの異なるクライアントとサーバー間での文字データの移動による問題を最小限にとどめることを目的とした機能です。AutoTranslate は、SQLDriverConnect の接続文字列や SQLConfigDataSource の構成文字列中に設定したり、ODBC アドミニストレータを使用して SQL Server Native Client ODBC ドライバのデータ ソースを構成するときに設定できます。

AutoTranslate が "no" に設定されると、クライアントの SQL_C_CHAR 変数と、SQL Server データベースの charvarchar、または text 型の列、変数、パラメータ間のデータ移動時に変換は行われません。この場合、データに拡張文字が含まれていて、クライアント コンピュータとサーバー コンピュータのコード ページが異なっていると、ビット パターンはクライアントとサーバーでは異なって解釈される可能性があります。クライアントとサーバーが同じコード ページを使用している場合は、データは同じ文字に解釈されます。

AutoTranslate が "yes" に設定されると、SQL Server Native Client ODBC ドライバが、Unicode を使用してクライアントの SQL_C_CHAR 変数と、SQL Server データベースの charvarchar、または text 型の列、変数、パラメータ間で移動されるデータの変換を行います。

  • データがクライアントの SQL_C_CHAR 変数から、SQL Server データベースの charvarchar、または text 型の列、変数、パラメータに送信される場合は、ODBC ドライバはまずクライアントの ACP を使用して SQL_C_CHAR を Unicode に変換し、その後、Unicode からサーバーの ACP を使用して再び文字に変換します。

  • データが SQL Server データベースの charvarchar、または text 型の列、変数、パラメータから、クライアントの SQL_C_CHAR 変数に送信される場合は、SQL Server Native Client ODBC ドライバはまずサーバーの ACP を使用して文字を Unicode に変換し、その後、Unicode からクライアントの ACP を使用して SQL_C_CHAR に変換します。

上記の変換はすべて、クライアント上で実行される SQL Server Native Client ODBC ドライバで行われるので、クライアント コンピュータにインストールされているコード ページの 1 つにサーバーの ACP が含まれている必要があります。

Unicode を使用して文字を変換することで、両方のコード ページに存在しているすべての文字を適切に変換できます。ただし、一方のコード ページにあっても、他方のコード ページにない文字の場合は、変換先のコード ページでは表現できません。たとえば、コード ページ 1252 には登録商標記号 (®) がありますが、コード ページ 437 にはこの記号がありません。

AutoTranslate の設定は、次の変換には影響しません。

  • 文字形式の SQL_C_CHAR クライアント変数と、SQL Server データベースの Unicode 形式の ncharnvarchar、または ntext 型の列、変数、パラメータ間のデータ移動。

  • Unicode 形式の SQL_C_CHAR クライアント変数と、SQL Server データベースの文字形式の charvarchar、または text 型の列、変数、パラメータ間のデータ移動。

文字から Unicode にデータが移動される場合、データは必ず変換されます。