異なる照合順序間でのデータのコピー

Microsoft SQL Server では、データは Unicode の列どうしをシームレスに移動できるので、変換は必要ありません。ただし、データが Unicode 以外の文字データが含まれる列間を移動する場合は、移動元のコード ページから移動先のコード ページに変換する必要があります。コード ページは、特定のスクリプトの順序付けられた文字のセットです。コード ページでは、数値インデックス (コード ポイント値) が各文字に関連付けられます。コード ページでは、さまざまな Microsoft Windows ロケールによって使用される、文字セットやキーボード レイアウトがサポートされています。サポートされているコード ページの一覧については、「コード ページのアーキテクチャ」を参照してください。

既定では文字データは次のように変換されます。

操作

変換先の文字データ

エクスポート

OEM コード ページ文字

インポート

ANSI/Microsoft Windows コード ページ文字

OEM コード ページと ANSI コード ページ間で変換を行うと、拡張文字または DBCS (2 バイト文字セット) 文字が失われます。SQL Server でのこのような変換を防ぐために、コード ページまたは照合順序を指定できます。

注意

別の照合順序へのデータベースの転送の詳細については、この Microsoft Web サイトを参照してください。

SQL Server 7.0 以降では、文字列の物理記憶領域は照合順序によって制御されます。サーバー インスタンス、データベース、テーブル列、および式の 4 つのレベルでの照合順序の設定がサポートされます。照合順序では、次の 3 つのプロパティを指定できます。

  • Unicode 以外の文字データの格納に使用するコード ページ。

  • Unicode データ型 (ncharnvarchar、および ntext) に使用する並べ替え順。並べ替え順では、文字を並べ替えるシーケンスが定義されます。また、比較演算で文字が評価される方法も決まります。

  • Unicode 以外の文字データ型 (char、varchar、および text) に使用する並べ替え順。

注意

フォーマット ファイルの各列に対して照合順序名を指定することをお勧めします。

コード ページと照合順序の概要については、「照合順序と Unicode のサポート」を参照してください。詳細については、「照合順序の使用」を参照してください。

列レベルの照合順序の使用

SQL Server 7.0 以降では、照合順序を指定してデータの変換を制御できます。この照合順序に従って、一括エクスポートの場合はエクスポート先データ ファイルのフィールドに、一括インポートの場合はインポート先のテーブルの列にデータが格納されます。データ ファイルの照合順序とデータベースのテーブル列の照合順序との間で必要な変換が、インポート操作またはエクスポート操作によって内部的に実行されます。

注意

SQL Server 7.0 以降では、コード ページの指定がサポートされますが、フォーマット ファイルで照合順序を指定することをお勧めします。

照合順序は、一括インポート操作と一括エクスポート操作のどちらも、常に、SQLCHAR 列に適用されます。ホスト データ型として SQLCHAR または SQLNCHAR が指定されていない列では、列の照合順序指定は常に無視されます。ORDER ヒントで列が参照される一括インポート操作中は、照合順序を使用して SQLCHAR 列と SQLNCHAR 列の両方の並べ替え順序が判断されます。

照合順序を指定するには、フォーマット ファイルを使用する必要があります。どちらの種類のフォーマット ファイルでも、列レベルの照合順序の指定がサポートされています。XML 以外のフォーマット ファイルでの照合順序の使用の詳細については、次の「XML 以外のフォーマット ファイルでの列レベルの照合順序の指定」を参照してください。XML フォーマット ファイルでの照合順序の使用の詳細については、「XML フォーマット ファイルについて」を参照してください。

XML 以外のフォーマット ファイルでの列レベルの照合順序の指定

XML 以外のフォーマット ファイルの最後の列 (序数位置 8 の列) には、その列のデータのデータ ファイルへの格納方法を定義する照合順序指定が含まれています。照合順序の列のオプションは、次のとおりです。

オプション

説明

name

データ ファイルにデータを格納するときに使用する照合順序の名前を指定します。SQL 照合順序名の一覧については、「SQL Server 照合順序名 (Transact-SQL)」を参照してください。

RAW

コマンドのコード ページ オプションまたは bcp_control BCPFILECP ヒントで指定されたコード ページに従ってデータを格納することを指定します。これらのいずれも指定されていない場合、データ ファイルの照合順序は、クライアント コンピューターの OEM コード ページの照合順序になります。

注意
コード ページ オプションの詳細については、このトピックの「コード ページの使用」を参照してください。BCPFILECP ヒントの詳細については、「bcp_control」を参照してください。

""

RAW と同じ意味です。

次の例では、フィールド 2 とフィールド 3 に列の照合順序を指定した XML 以外のフォーマット ファイルを示します。照合順序の情報は太字で示されています。

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""
注意

上記のフォーマット ファイルは、AdventureWorks2008R2 サンプル データベース内の HumanResources.Department テーブル用です。このテーブルには、DepartmentIDNameGroupName、および ModifiedDate の 4 つの列があります。

XML 形式以外のファイルの詳細については、「XML 以外のフォーマット ファイルについて」を参照してください。

コード ページの使用

注意

データの変換を制御するには、一括エクスポート操作または一括インポート操作で、フォーマット ファイルを使用して列レベルの照合順序を指定することをお勧めします。詳細については、前述の「列レベルの照合順序の使用」を参照してください。

コード ページを指定する構文は次のとおりです。

  • bcp コマンドでコード ページを指定するには、-C スイッチを使用します。

    -C { ACP | OEM | RAW | code_page }

  • BULK INSERT ステートメントまたは INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントでコード ページを指定するには、CODEPAGE オプションを使用します。

    CODEPAGE = { **'**ACP '| **'**OEM '| **'**RAW '| 'code_page' }

-C スイッチと CODEPAGE オプションのどちらも、コード ページに次の値を使用できます。

コード ページ値

説明

ACP

インポート操作時は、charvarchar、または text のデータ型のデータ フィールドが、ANSI/Windows コード ページ (ISO 1252) から SQL Server コード ページに変換されることを指定します。

エクスポート操作時は、bcp により、これらの列が SQL Server コード ページから ANSI/Windows コード ページに変換されることを指定します。

OEM (既定値)

インポート操作時は、charvarchar、または text のデータ型のデータ フィールドが、システム OEM コード ページから SQL Server コード ページに変換されることを指定します。

エクスポート操作時は、bcp により、これらの列が SQL Server コード ページからシステム OEM コード ページに変換されることを指定します。

RAW

コード ページの変換は行われません。これは最速のオプションです。

code_page

850 などの特定のコード ページ番号。サポートされているコード ページの一覧については、「コード ページのアーキテクチャ」を参照してください。

この例では、AdventureWorks2008R2 データベースの HumanResources.myTeam テーブルが使用されています。このテーブルを作成しないと、例を実行できません。テーブルおよびテーブルの作成方法の詳細については、「HumanResources.myTeam テーブルの作成」を参照してください。

注意

この例をテストする前に、主キーの競合を避けるために、myTeam テーブルから既存の行を削除します。

A. bcp でコード ページを使用する

この例では、bcp により、コード ページ 850 を使用して、AdventureWorks2008R2 データベースの HumanResources.myTeam テーブルから、myTeam850.txt データ ファイルにデータを一括エクスポートします。Windows コマンド プロンプトで、次のように入力します。

bcp AdventureWorks2008R2.HumanResources.myTeam out myTeam850.txt -c -C850 -T

bcp AdventureWorks2008R2.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. BULK INSERT でコード ページを使用する

この例では、BULK INSERT を使用して、前の bcp の例で作成した myTeam850.txt を AdventureWorks2008R2HumanResources.myTeam テーブルに一括インポートします。

SQL Server Management Studio クエリ エディターなどのクエリ ツールから、次のコードを実行します。

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myTeam;
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myTeam;
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

異なる照合順序間でのデータの一括エクスポート

一括エクスポート操作では、照合順序指定により、データ ファイルに文字データを格納するのに使用するコード ページが制御されます。照合順序指定は、次の項目に適用されます。

  • 文字形式データ ファイル内のすべての列。

  • SQLCHAR がホスト ファイル データ型として指定されているネイティブ モード ファイル内のすべての列。

  • 値が 127 より大きいか、32 未満の SQLCHAR 文字。

    照合順序は、値が 32 ~ 127 の文字に適用されますが、すべてのコード ページでは、32 ~ 127 の値に同じ文字がマップされているので、異なる照合順序を適用しても効果はありません。

一括エクスポート操作で、どの照合順序またはコード ページを使用するかを決定するルールは、次のとおりです。

  • 列の照合順序がフォーマット ファイルで指定されているか、ODBC bcp_setcolfmt 関数 (bcp_setcolfmt) で指定されている場合は、その照合順序に関連付けられている ANSI コード ページを使用して文字データが格納されます。

  • 列の照合順序が指定されていない場合に、コマンドのコード ページ オプションによりコード ページが指定されているとき、または bcp_control BCPFILECP ヒントによりコード ページが指定されているときは、列の照合順序が指定されていない列のすべての SQLCHAR データは、指定されたコード ページを使用して格納されます。

    注意

    コード ページ オプションの詳細については、このトピックの「コード ページの使用」を参照してください。BCPFILECP ヒントの詳細については、「bcp_control」を参照してください。

  • 照合順序またはコード ページが指定されていない場合、クライアント コンピューターの OEM コード ページを使用して SQLCHAR データが格納されます。

注意

照合順序またはコード ページに関する情報は、データ ファイルには格納されません。

異なる照合順序間でのデータの一括インポート

一括インポート操作では、文字形式、SQLCHAR、データ ファイル内のデータとして格納された列に、コード ページの解釈が適用されます。文字形式のデータ ファイルでは、すべての列が SQLCHAR として格納されます。照合順序またはコード ページに関する情報はデータ ファイルには格納されないので、一括インポート操作では、データ フィールドの照合順序またはコード ページに関する情報を指定する必要があります。

一括インポート操作で、どの照合順序またはコード ページを使用するかを決定するルールは、次のとおりです。

  • フォーマット ファイルで列の照合順序を指定したり、ODBC bcp_setcolfmt 関数 (bcp_setcolfmt) で列の照合順序を指定するときは、指定した列の照合順序に関連付けられた ANSI コード ページを使用して、データ ファイル内の SQLCHAR データが解釈されます。照合順序の指定は、データ ファイル内の照合順序に一致させてください。

  • 列の照合順序が指定されていない場合、コマンドでコード ページ オプションを使用してコード ページが指定されているとき、または bcp_control BCPFILECP ヒントでコード ページが指定されているときは、指定されたコード ページを使用して SQLCHAR データが解釈されます。

    注意

    コード ページ オプションの詳細については、このトピックの「コード ページの使用」を参照してください。BCPFILECP ヒントの詳細については、「bcp_control」を参照してください。

  • 照合順序またはコード ページが指定されていない場合は、クライアント コンピューターの OEM コード ページを使用して、SQLCHAR 列内のデータが解釈されます。

一括インポート操作では、照合順序指定によって次の項目が制御されます。

  • 操作でデータ ファイル内の SQLCHAR 列のコード ページが解釈される方法。

  • 指定されている場合、bcp または BULK INSERT が ORDER ヒントを適用する方法。

    ORDER ヒントを使用している場合、一括インポート操作ではその ORDER ヒントを適切に解釈するために照合順序が使用されます。このヒントは、SQLCHAR 列と SQLNCHAR 列の両方に適用されます。ORDER ヒントによって参照される列のデータは、列にマップされた照合順序の定義に従っていなければなりません。詳細については、「データの一括インポート時の並べ替え順の制御」を参照してください。