クライアント コード ページがサーバー コード ページと異なる場合は、SQL Server ODBC ドライバーを使用して文字データをクライアントからサーバーに正しく変換できません。

この記事では、ODBC ドライバーを使用するときにクライアント データの変換が正しくない問題を回避SQL Server役立ちます。

元の製品バージョン:  SQL Server
元の KB 番号:   234748

現象

MDAC 2.1 以降のバージョンの SQL Server ODBC ドライバー (バージョン 3.70.0623 以降) または OLEDB プロバイダー (バージョン 7.01.0623 以降) を使用する場合、状況によっては、接続が無効になっている場合でも、クライアント コード ページからサーバー コード ページへの文字データの変換が発生する場合があります。 Autotranslation

原因

Autotranslation コード ページ変換の結果として生じ得るメカニズムは、唯一のメカニズムではありません。 SQL SERVER 7.0 ODBC ドライバーと OLEDB プロバイダーは、MSDE 1.0、SQL Server 7.0、またはそれ以降のバージョンのどちらかに接続するときに新しい動作を導入します。 言語SQLとして送信されたすべてのステートメントは、サーバーに送信される前に、クライアント上の Unicode に変換されます。 終了効果は、接続の現在の設定に関係なく、言語イベントを介してクライアントからサーバーに流れるすべてのデータに Autotranslation Autotranslation 似ています。 翻訳されていない文字データを、コード ページ以外のコード ページから保存する場合を除き、SQL Serverは導入されません。

回避策

コード ページ X データは、コード ページ Y SQL Server に保存しません (たとえば、コード ページ 1252 サーバー内のコード ページ 950 データ)。 これは、以前のバージョンのバージョンの SQL Server可能ですが、常にサポートされていません。 1252 文字SQL Server、1252 文字以外は有効な文字データではありません。 別のコード ページの Unicode 以外の文字データは正しく並べ替えされません。また、デュアル バイト (DBCS) データの場合、SQL Server は文字の境界を正しく認識しません。 重大な問題を引き起こす可能性があります。

サーバーのコード SQL Server最適な選択は、サーバーにアクセスするクライアントのコード ページです。

サーバーとクライアントのコード ページは異なる場合がありますが、クライアントで自動変換が有効になっているので、すべての場合にサーバーのコード ページとの間でデータを適切に変換する必要があります。

サーバーが複数のコード ページのデータを格納する必要がある場合、サポートされるソリューションは、データを Unicode 列 ( ) に格納することです NCHAR/NVARCHAR/NTEXT

状況でコード ページ X データをコード ページ Y SQL Server に格納する必要がある場合、これを確実に行う方法は 2 つのみです。

  • データをバイナリ列 ( ) BINARY/VARBINARY/IMAGE 列に格納します。
  • 文字データを処理するすべてのステートメントに対してリモート プロシージャ 呼び出し (RPC) を使用SQLアプリケーションを記述します。 RPC イベントを介して送信されるデータは、変換の対象ではありません。 ドライバーまたは DSN レベルでは、送信されるイベントの種類を変更するために実行できる操作は何もありません。 コマンドが言語イベントまたは RPC イベントとして送信されるかどうかは、アプリケーションの書き込み時にプログラマが選択した API と構文によって完全に異なります。

詳細情報

自動変換 (つまり、新しいODBC アプリケーションで文字データの変換を実行するチェック ボックス) は、Unicode を変換メディアとして使用して、データをサーバーに送信する前に、クライアント コード ページからサーバー コード ページに文字データを変換します。 ただし、3.7 SQL Server ODBC ドライバーは、言語イベントとして送信された SQL ステートメントもすべて Unicode に変換してからワイヤーに配置します。これは自動変換に似ていますが、自動変換設定によって制御されません。 これに対し、サーバーからクライアントに戻る文字データは、自動変換フラグを尊重します。自動変換がオフの場合、データはサーバー上のデータと同じ文字コードでクライアント アプリケーションに到着します。 同様に、クライアントからサーバーへの RPC イベントのデータの変換は、自動変換をオフにすることで無効にすることができます。 動作が言語イベントにどのように影響するかを示す簡単なスクリプトが続きます。 この例は、コード ページ 437 サーバーに接続しているコード ページ 1252 クライアントのクエリ アナライザーから実行されました。

-- Turn Autotranslation off here.
 USE tempdb
 GO
 CREATE TABLE t1 (c1 int, c2 char(1))
 GO

-- Enter a yen character, using the keystroke ALT-0165.
 INSERT INTO t1 VALUES (1, '¥') 
 SELECT c1, c2, ASCII (c2) FROM t1
c1 c2 
 ----------- ---- ----------- 
 1  157

(1 row(s) affected)

前の例について次に示します。

  • このバッチ中はオフの場合でも、文字コード Autotranslation 165 (コード ページ 1252 の円) は 157 (コード ページ 437 の円) に変換されました。 これは、ODBC ドライバーがサーバーを送信する前に SQL 文字列を Unicode に変換したため、サーバーはコード ページ 437 のストレージに適した文字に変換できたためです。
  • クライアントが SELECT を実行して保存されたデータを取得すると、文字 157 はクライアントに翻訳されません (157 は、コード ページ 1252 クライアントにボックス '' として表示されます)。 これは、この記事で説明する変換は、サーバーからクライアントに送信されるデータではなく、クライアントからサーバーに送信されるデータにのみ適用されるためです。 設定がオフのため、データは Autotranslation 翻訳されません。
-- Turn Autotranslation back on before running the following batch.
 INSERT INTO t1 VALUES (2, '¥')
 SELECT c1, c2, ASCII (c2) FROM t1
c1 c2 
 ----------- ---- ----------- 
 1 ¥ 157
 2 ¥ 157

(2 row(s) affected)

この場合、オンにしてもクライアントからサーバーへの変換には影響しません (つまり、文字コード 165 から文字コード 157 への同じ正しい変換が発生しました)、サーバーから取得されたデータに影響がありました。 Autotranslation この時点で SELECT ステートメントを実行すると (オンの場合)、円記号は、コード コード 157 から文字コード 165 にメカニズムによって変換されたため、コード ページ Autotranslation 1252 アプリケーションに正しく表示されます。 Autotranslation

SQL Server ODBC ドライバー バージョン 3.70 以降を使用し、SQL Server 7.0 以降に接続すると、この動作 (クライアント上の Unicode への言語イベントの変換) が表示されます。 古い ODBC ドライバーを使用する場合、または 3.7 ドライバーを使用して 6.5 以前に接続SQL Server発生しません。 さらに、Unicode 列 ( ) にデータを格納する場合 NCHAR/NVARCHAR/NTEXT 、変換は問題ではありません。

SQL Server 2005 での文字データの表現方法の詳細については、「クライアント コンピューターのコード ページが SQL Server 2005のデータベースのコード ページと異なる場合、文字データが正しく表されない」を参照してください。