異なる照合順序間でのデータのコピー
ネイティブ形式または文字形式の bcp を使用してデータを一括コピーする場合に、既定では文字データは次のように変換されます。
- Microsoft® SQL Server™ のインスタンスからデータをエクスポートする場合は、OEM コード ページ文字
- SQL Server のインスタンスにデータをインポートする場合は、ANSI/Microsoft Windows® コード ページ文字
これは、OEM と ANSI コード ページ間の変換中に拡張文字または DBCS 文字が失われる原因となることがあります。拡張文字または DBCS 文字の損失を防ぐために、bcp は次のいずれかを使用してデータ ファイルを作成できます。
- Unicode ネイティブ データ形式 (-N)
- Unicode 文字データ形式 (-w)
- 特定のコード ページ (-C)
Unicode ネイティブ形式と Unicode 文字形式は、一括コピー中に文字型データを Unicode に変換するため、拡張文字の損失は生じません。
-C (コード ページ) スイッチを使用すると、bcp ユーティリティはユーザーが指定するコード ページを使用して、データ ファイルを作成し、読み込むことができます。たとえば、コード ページ 850 を使用して、pubs データベースの authors2 テーブルを Authors.txt データ ファイルに一括コピーするには、コマンド プロンプトで次のコマンドを実行します。
bcp pubs..authors2 out authors.txt -c -C850 -Sservername -Usa -Ppassword
または、BULK INSERT ステートメントで CODEPAGE 句を指定すれば、ユーザーが指定するコード ページを使用してデータ ファイルを読み込むことができます。たとえば、コード ページ 850 を使用して、Authors.txt データ ファイルを pubs データベースの authors2 テーブルに一括コピーするには、SQL クエリ アナライザなどのクエリ ツールから次のコマンドを実行します。
BULK INSERT pubs..authors2 FROM 'c:\authors.txt'
WITH (
CODEPAGE = 850
)
次の表は、コード ページの有効な値を示しています。
| コード ページ値 | 説明 |
| ACP | char、varchar、または text 型の列は、データを SQL Server のインスタンスにインポートするとき、ANSI/Windows コード ページ (ISO 1252) から SQL Server コード ページに変換され、SQL Server のインスタンスからデータをエクスポートするとき、それと逆の方向に変換されます。 |
| OEM (既定値) | char、varchar、または text 型の列は、データを SQL Server のインスタンスにインポートするとき、システムの OEM コード ページから SQL Server コード ページに変換され、SQL Server のインスタンスからデータをエクスポートするとき、それと逆の方向に変換されます。 |
| RAW | コード ページ間の変換は行われないため、これは最も速く処理するためのオプションです。 |
| <value> | 850 などの特定のコード ページ番号。 |
列レベルの照合順序
SQL Server 2000 では、一括コピー操作に列レベルの照合順序を指定できます。照合順序では、文字および Unicode データがデータ ファイルの指定された列にどのように格納されるのかを定義します。
ユーザーおよびアプリケーションは、データ ファイルにデータを格納するときの照合順序だけを指定します。一括コピー コンポーネントが、必要とされるデータ ファイルの照合順序とデータベース内のコピー元列の照合順序、またはコピー先列の照合順序との間の変換を内部で実行します。
書き出し一括コピー操作では、列照合順序とデフォルトの照合順序を指定することによって、一括コピー データ ファイルで SQLCHAR データを作成するときに使用するコード ページを定義します。読み込み一括コピー操作では、列の照合順序とデフォルトの照合順序を指定することによって、コピー元データ ファイルから SQLCHAR データを読み取るときに使用するコード ページを定義します。
読み込み一括コピー操作で SORTED ヒントが指定されている場合は、SORTED ヒントで参照されている文字列および Unicode 列に対して定義されている照合順序がデータの順序を定義します。
読み込み一括コピー操作では、指定する照合順序が、一括コピー データ ファイル内に存在する照合順序に対応していることを確認する必要があります。
SQL Server 2000 のフォーマット ファイルでは、列のデータをデータ ファイルに格納する方法を定義する照合順序を指定するための 8 番目の列をサポートしています。
- "RAW" は、C スイッチ、BCPFILECP ヒント、または CODEPAGE オプションで指定された照合順序に従ってデータを格納するように指定します。これらのいずれも指定されていない場合は、一括コピー クライアント コンピュータの OEM コード ページがデータ ファイルの照合順序になります。
- "name" は、データ ファイルにデータを格納するときに使用する照合順序の名前を指定します。
- "" は、RAW と同じ意味です。
次は、列の照合順序が指定されているフォーマット ファイルの例です。
8.0
5
1 SQLCHAR 0 4 "/t" pub_id 1 "SQL_LATIN1_General_Cp1_CI_AS_KI_WI"
2 SQLCHAR 0 40 "/t" pub_name 2 "SQL_LATIN1_General_Cp850_BIN"
3 SQLCHAR 0 20 "/t" city 3 "RAW"
4 SQLCHAR 0 2 "/t" state 4 "RAW"
5 SQLCHAR 0 30 "/t" country 5 ""
SQLCHAR または SQLNCHAR がホスト データ型として指定されていない列では、列の照合順序の指定は無視されます。書き出し一括コピー操作では、SQLNCHAR 列の照合順序は無視されます。この照合順序は、SORTED ヒントで SQLNCHAR 列が参照されている場合の読み込み一括コピー操作でのみ適用されます。SQLCHAR 列に対しては、書き出し一括コピー操作と読み込み一括コピー操作の両方で照合順序が適用されます。
書き出し一括コピー操作では、照合順序の指定によって、一括コピー データ ファイルに文字データを格納するときに使用するコード ページのみ制御されます。照合順序の指定は、次の項目に適用されます。
- 文字モード データ ファイル内のすべての列
- SQLCHAR がホスト ファイル データ型として指定されているネイティブモード ファイル内のすべての列
- 値が 127 を超えるか、32 未満の SQLCHAR 文字。値が 32 と 127 の間の文字にも照合順序が適用されますが、32 から 127 の間の値には、すべてのコード ページで同じ文字が割り当てられているため、異なる照合順序を適用しても効果はありません。
書き出し一括コピーに使用する照合順序は、次の規則に従って決めます。
- 列の照合順序がフォーマット ファイルで、または bcp_setcolfmt で指定されている場合は、その照合順序に関連付けられている ANSI コード ページを使用して文字データを格納します。この規則は、照合順序を指定するほかのすべての方法より優先されます。
- 列の照合順序が指定されていない場合で、bcp C スイッチまたは bcp_control BCPFILECP ヒントが指定されているとき、BCPFILECP または C で指定されているコード ページを使用して、照合順序が指定されていない列のすべての SQLCHAR データを格納します。フォーマット ファイルを持たない文字モード データ ファイルを生成する場合は、いずれの列に対しても列の照合順序は指定されません。この規則は、列の照合順序として "" または "RAW" が指定されている場合にも適用されます。
- 列の照合順序、C スイッチ、および BCPFILECP ヒントを含む照合順序がまったく指定されていない場合は、一括コピー クライアント コンピュータの OEM コード ページを使用して SQLCHAR データを格納します。
読み込み一括コピー操作では、照合順序の指定によって次の項目が制御されます。
- データ ファイル内の SQLCHAR 列のコード ページを一括コピーが解釈するときの方法
- 一括コピーが ORDER ヒントを適用する方法
読み込み一括コピー操作では、コード ページの解釈は、データ ファイルに SQLCHAR として格納されている列に対してのみ適用されます。文字モード データ ファイル内のすべての列は、SQLCHAR としてデータ ファイルに格納されています。この規則は、フォーマット ファイルで、または bcp_setcolfmt を使用することによって SQLCHAR が指定されているすべての列にも適用されます。
- フォーマット ファイルで、または bcp_setcolfmt で列の照合順序が指定されている場合は、その照合順序に関連付けられている ANSI コード ページを使用してデータ ファイル内の SQLCHAR データを解釈します。
- 列の照合順序が指定されておらず、BULK INSERT CODEPAGE オプション、bcp C スイッチ、または bcp_control BCPFILECP ヒントを使用してデフォルトのコード ページが指定されている場合は、CODEPAGE、C、または BCPFILECP で指定されているコード ページを使用して SQLCHAR データを解釈します。
- ユーザーが列の照合順序、BULK INSERT CODEPAGE オプション、bcp C スイッチ、および BCPFILECP ヒントを含む照合順序をまったく指定しなかった場合は、クライアント コンピュータの OEM コード ページを使用して SQLCHAR 列のデータを解釈します。
読み込み一括コピー操作では、ORDER 一括コピー ヒントを正しく解釈するためにも照合順序を使用します。この規則は、SQLCHAR 列および SQLNCHAR 列の両方に適用されます。SORTED ヒントによって参照される列のデータは、列に割り当てられた照合順序の定義に従っていなければなりません。
関連項目
Unicode 文字形式
Unicode ネイティブ形式