次の方法で共有


Collation and Unicode Support

SQL Server の照合順序により、並べ替え規則、大文字と小文字の区別、およびアクセントの区別のプロパティをデータで利用できるようになります。 charvarchar などの文字データ型に使用する照合順序は、そのデータ型で表すことのできるコード ページおよび対応する文字を指定します。 SQL Serverの新しいインスタンスをインストールする場合でも、データベース バックアップを復元する場合でも、サーバーをクライアント データベースに接続する場合でも、使用するデータのロケール要件、並べ替え順序、大文字と小文字とアクセントの区別を理解しておくことが重要です。 SQL Serverのインスタンスで使用できる照合順序の一覧については、「sys.fn_helpcollations (Transact-SQL)」を参照してください。

サーバー、データベース、列、または式の照合順序を選択すると、データベースのさまざまな操作の結果に影響を与える特定の特性がデータに割り当てられます。 たとえば、ORDER BY を使用してクエリを構築する場合、結果セットの並べ替え順序は、データベースに適用される照合順序、またはクエリの式レベルで COLLATE 句に指定される照合順序に依存します。

SQL Serverで照合順序のサポートを最適に使用するには、このトピックで定義されている用語と、それらがデータの特性にどのように関連しているかを理解する必要があります。

照合順序

照合順序は、データセット内の各文字を表すビット パターンを指定します。 また、照合順序はデータの並べ替えおよび比較を行うための規則を決定します。 SQL Server では、単一のデータベース内で異なる照合順序を持つオブジェクトを格納できます。 非 Unicode 列の場合は、照合順序の設定によってデータのコード ページと表示可能な文字が指定されます。 非 Unicode 列の間を移動するデータは、移動元のコード ページから移動先のコード ページに変換する必要があります。

Transact-SQL ステートメントは、異なる照合順序が設定されているさまざまなデータベースのコンテキストで実行された場合、ステートメントの結果が異なる場合があります。 可能であれば、組織全体で同じ照合順序を使用してください。 これにより、それぞれの文字または Unicode 表現について、照合順序を明示的に指定する必要がなくなります。 異なる照合順序とコード ページが設定されたオブジェクトを操作する場合は、照合の優先順位の規則を考慮してクエリを作成します。 詳細については、「 照合順序の優先順位 (Transact-SQL)」を参照してください。

照合順序に関連するオプションは、大文字と小文字の区別、アクセントの区別、かなの区別、および文字幅の区別です。 これらのオプションは、照合順序の名前に付加することによって指定されます。 たとえば、 Japanese_Bushu_Kakusu_100_CS_AS_KS_WS という照合順序では、大文字と小文字、アクセント、かな、および文字幅が区別されます。 次の表は、これらのオプションに関連付けられている動作を示しています。

オプション 説明
大文字と小文字を区別する (_CS) 大文字と小文字を区別します。 このオプションを選択すると、大文字より先に小文字が並べ替えられます。 このオプションを選択しないと、照合順序で大文字と小文字が区別されなくなります。 つまり、大文字と小文字は、並べ替えを行う際に SQL Server によって同じものと見なされます。 大文字と小文字を区別しないことを明示的に選択するには、_CI と指定します。
アクセントを区別する (_AS) アクセントのある文字とアクセントのない文字を区別します。 たとえば、"a" と "á" は等しくありません。 このオプションを選択しないと、照合順序でアクセントが区別されなくなります。 つまり、アクセントのある文字とアクセントのない文字は、並べ替えを行う際に SQL Server によって同じものと見なされます。 アクセントを区別しないことを明示的に選択するには、_AI と指定します。
かなを区別する (_KS) 次の 2 種類の日本語かな文字を区別します。ひらがなとカタカナ。 このオプションを選択しないと、照合順序でかなが区別されません。 つまり、ひらがなとカタカナは、並べ替えを行う際に SQL Server によって同じものと見なされます。 かなを区別しないように指定する唯一の方法は、このオプションを省略することです。
文字幅を区別する (_WS) 全角文字と半角文字を区別します。 このオプションを選択しないと、同じ文字の全角表現と半角表現は、並べ替えを行う際に同じものと見なされます。 文字幅を区別しないように指定する唯一の方法は、このオプションを省略することです。

SQL Server では、次の照合順序のセットをサポートしています。

Windows 照合順序
Windows 照合順序は、関連する Windows システム ロケールに基づく文字データを格納するための規則を定義します。 Windows 照合順序では、非 Unicode データの比較が、Unicode データと同じアルゴリズムを使用して実装されます。 基本の Windows 照合順序規則では、辞書順の並べ替えが適用される場合に使用される文字または言語と、非 Unicode 文字データの格納に使用されるコード ページを指定します。 Unicode 順の並べ替えと非 Unicode 順の並べ替えは、いずれも、特定のバージョンの Windows の文字列比較と互換性があります。 これにより、SQL Server内のデータ型間の一貫性が提供されます。また、開発者は、SQL Serverで使用されるのと同じルールを使用して、アプリケーション内の文字列を並べ替えることもできます。 詳細については、「Windows 照合順序名 (Transact-SQL)」を参照してください。

バイナリ照合順序
バイナリ照合順序では、ロケールおよびデータ型によって定義されるコーディングされた値の順序に基づいてデータを並べ替えます。 バイナリ照合順序では大文字と小文字が区別されます。 SQL Serverのバイナリ照合順序は、使用されるロケールと ANSI コード ページを定義します。 また、バイナリ並べ替え順を実施します。 これらは比較的単純なので、バイナリ照合順序はアプリケーションのパフォーマンスを向上させるために役立ちます。 非 Unicode データ型の場合は、ANSI コード ページで定義されているコード ポイントに基づいてデータが比較されます。 Unicode データ型の場合は、Unicode コード ポイントに基づいてデータが比較されます。 Unicode データ型のバイナリ照合順序では、データを並べ替える際にロケールが考慮されません。 たとえば、Unicode データに対して Latin_1_General_BIN と Japanese_BIN を使用した場合、並べ替え結果はどちらも同じになります。

SQL Serverには、古いBIN照合順序と新しいBIN2照合順序の 2 種類のバイナリ照合順序があります。 BIN2 照合順序では、すべての文字はコード ポイントに従って並べ替えられます。 BIN 照合順序では、最初の文字のみがコード ポイントに従って並べ替えられ、残りの文字はバイト値に従って並べ替えられます。 (Intel プラットフォームはリトル エンディアン アーキテクチャであるため、Unicode コード文字は常にバイト スワップして格納されます)。

SQL Server 照合順序
SQL Server 照合順序 (SQL_*) では、以前のバージョンの SQL Server と互換性のある並べ替え順が使用されます。 非 Unicode データについては、辞書順での並べ替え規則は Windows オペレーティング システムによって提供されるどの並べ替えルーチンとも互換性はありません。 ただし、Unicode データの並べ替えは、特定のバージョンの Windows 並べ替え規則と互換性があります。 SQL Server照合順序では Unicode 以外のデータと Unicode データに対して異なる比較規則が使用されるため、基になるデータ型に応じて、同じデータの比較の結果が異なります。 詳細については、「SQL Server 照合順序名 (Transact-SQL)」を参照してください。

注意

SQL Serverの英語のインスタンスをアップグレードする場合、SQL Serverの既存のインスタンスとの互換性のためにSQL Server照合順序 (SQL_*) を指定できます。 SQL Serverのインスタンスの既定の照合順序はセットアップ時に定義されるため、次の条件に該当する場合は、照合順序の設定を慎重に指定してください。

  • アプリケーション コードが以前の SQL Server 照合順序の動作に依存している場合。
  • 複数の言語に対応する文字データを格納する必要がある場合。

照合順序の設定は、 SQL Serverのインスタンスの次のレベルでサポートされます。

サーバーレベルの照合順序
既定のサーバー照合順序は、SQL Serverセットアップ中に設定され、システム データベースとすべてのユーザー データベースの既定の照合順序にもなります。 Unicode のみの照合順序は、サーバー レベルの照合順序としてサポートされていないため、SQL Serverセットアップ中に選択できないことに注意してください。

サーバーに照合順序を指定した後は、照合順序を簡単には変更できません。変更するには、すべてのデータベース オブジェクトとデータをエクスポートし、master データベースを再構築してから、すべてのデータベース オブジェクトとデータをインポートする必要があります。 SQL Serverのインスタンスの既定の照合順序を変更する代わりに、新しいデータベースまたはデータベース列を作成するときに目的の照合順序を指定できます。

データベースレベルの照合順序
データベースを作成または修正する際には、CREATE DATABASE または ALTER DATABASE ステートメントの COLLATE 句を使用して、データベースの既定の照合順序を指定できます。 照合順序が指定されない場合、データベースにはサーバーの照合順序が割り当てられます。

サーバーの照合順序を変更すること以外に、システム データベースの照合順序を変更する方法はありません。

データベースの照合順序は、データベース内のすべてのメタデータで使用され、データベース内で使用されるすべての文字列型の列、一時オブジェクト、変数名、およびその他のすべての文字列の既定値になります。 ユーザー データベースの照合順序を変更する場合は、データベースのクエリが一時テーブルにアクセスするときに照合順序が競合する可能性があります。 一時テーブルは常に tempdb システム データベースに格納され、このデータベースではインスタンスの照合順序が使用されます。 ユーザー データベースと tempdb の文字データを比較するクエリは、文字データの評価で照合順序が競合すると、失敗します。 この問題は、クエリに COLLATE 句を指定することで解決できます。 詳細については、「COLLATE (Transact-SQL)」を参照してください。

列レベルの照合順序
テーブルを作成または変更するときに、COLLATE 句を使用して、文字列型の各列に対して照合順序を指定できます。 照合順序を指定しない場合、データベースの既定の照合順序が列に割り当てられます。

式レベルの照合順序
式レベルの照合順序は、ステートメントの実行時に設定され、結果セットが返される方法に影響を及ぼします。 これにより、ORDER BY の並べ替え結果をロケール固有のものにすることができます。 式レベルの照合順序を実装するには、次のような COLLATE 句を使用します。

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;  

Locale

ロケールは、場所またはカルチャに関連付けられる一連の情報です。 これには、言語の名前や ID、言語の記述に使用される文字表記、文化的慣習などがあります。 照合順序は、1 つ以上のロケールに関連付けることができます。 詳細については、「 Microsoft によって割り当てられているロケール ID」を参照してください。

コード ページ

コード ページは、特定の文字表記の順序付けられた文字のセットです。コード ページでは、数値インデックス (コード ポイント値) が各文字に関連付けられます。 Windows コード ページは、通常は 文字セット または charsetと呼ばれています。 コード ページは、各種の Windows システム ロケールで使用される文字セットおよびキーボード レイアウトをサポートするために使用されます。

並べ替え順序

並べ替え順序は、データ値の並べ替え方法を指定します。 これは、データ比較の結果に影響を及ぼします。 データは、照合順序を使用して並べ替えられ、インデックスを使用して最適化することができます。

Unicode のサポート

Unicode は、コード ポイントを文字にマップするための標準です。 Unicode は世界中のすべての言語のすべての文字を処理できるようにデザインされているので、異なる文字のセットを扱うために他のコード ページを必要とすることがありません。 複数の言語を反映する文字データを格納する場合は、非 Unicode データ型 (ncharnvarchar、および ntext) ではなく、Unicode データ型 (charvarchar、および text) を常に使用してください。

非 Unicode データ型には、多くの制限が関連付けられています。 これは、Unicode に対応していないコンピューターではコード ページの使用が 1 つに制限されているためです。 Unicode コードを使用すると、必要なコード ページ変換が少なくなるので、パフォーマンスの向上が期待できます。 Unicode 照合順序は、サーバー レベルではサポートされないため、データベース、列、式の各レベルで個別に選択する必要があります。

クライアントが使用するコード ページは、オペレーティング システムの設定によって決まります。 Windows オペレーティング システムでクライアント コード ページを設定するには、コントロール パネルの [地域と言語のオプション] を使用します。

データをサーバーからクライアントに移動するとき、古いクライアント ドライバーでサーバー照合順序が認識されないことがあります。 これは、データを Unicode サーバーから非 Unicode クライアントに移動する場合に発生する可能性があります。 最善の対処方法は、クライアント オペレーティング システムをアップグレードして、基になるシステムの照合順序を更新することです。 クライアントにデータベース クライアント ソフトウェアがインストールされている場合は、データベース クライアント ソフトウェアにサービスの更新プログラムを適用する方法もあります。

また、サーバー上のデータに異なる照合順序を使用してみることもできます。 クライアントのコード ページにマップする照合順序を選択します。

SQL Server 2019 (15.x) で使用できる UTF-16 照合順序を使用するには、補助文字_SC照合順序 (Windows 照合順序のみ) のいずれかを選択して、一部の Unicode 文字の検索と並べ替えを改善できます。

Unicode または非 Unicode データ型の使用に関連する問題点を評価するには、使用環境におけるパフォーマンスの違いを測定するためのシナリオをテストする必要があります。 組織内のシステムで使用する照合順序を標準化し、可能であれば Unicode サーバーおよびクライアントを配置するようにしてください。

多くの場合、SQL Serverは他のサーバーやクライアントとやり取りし、organizationはアプリケーションとサーバー インスタンスの間で複数のデータ アクセス標準を使用する場合があります。 SQL Server クライアントは次の 2 つの主要タイプのいずれかになります。

  • OLE DB および Open Database Connectivity (ODBC) Version 3.7 以降のバージョンを使用するUnicode クライアント

  • DB ライブラリおよび ODBC Version 3.6 以前のバージョンを使用する非 Unicode クライアント

以下の表は、Unicode 型サーバーと非 Unicode 型サーバーの各種の組み合わせにおける多言語データの使用に関する情報を示しています。

サーバー Client 利点または制限事項
Unicode Unicode このシナリオでは、システム全体で Unicode データが使用されるため、最高のパフォーマンスが実現され、取得されるデータが破損から保護されます。 これは、ActiveX Data Objects (ADO)、OLE DB、および ODBC Version 3.7 以降のバージョンの場合に該当します。
Unicode 非 Unicode このシナリオでは、特に、新しいオペレーティング システムを実行しているサーバーと、古いバージョンのSQL Serverを実行しているクライアント、または古いオペレーティング システムとの間の接続では、データをクライアント コンピューターに移動するときに制限やエラーが発生する可能性があります。 サーバー上の Unicode データは、非 Unicode クライアント上の対応するコード ページにマップしてデータを変換しようと試みます。
非 Unicode Unicode これは、多言語データの使用に理想的な構成とはいえません。 Unicode データを非 Unicode サーバーに書き込むことはできません。 サーバーのコード ページ内に存在しないサーバーにデータを送信すると、問題が発生する可能性があります。
非 Unicode 非 Unicode これは、多言語データに関して非常に制限的なシナリオです。 使用できるコード ページは 1 つだけです。

補助文字

SQL Server には、 や などのncharデータ型が用意されておりnvarchar、Unicode データを格納します。 これらのデータ型は、 UTF-16と呼ばれる形式でテキストをエンコードします。 Unicode コンソーシアムは、各文字に一意のコード ポイント (0x0000 から 0x10FFFF の範囲の値) を割り当てています。 最もよく使用される一連の文字にはメモリとディスク上で 16 ビット ワードに収まるコード ポイント値がありますが、コード ポイント値が 0xFFFF を超える文字は、連続した 2 つの 16 ビット ワードを必要とします。 これらの文字は 補助文字と呼ばれ、2 つの連続する 16 ビット ワードは サロゲート ペアと呼ばれます。

補助文字を使用する場合は、以下の点に注意してください。

  • 補助文字は、90 以上の照合順序バージョンで、並べ替えと比較の操作に使用できます。

  • すべての _100 レベルの照合順序で、補助文字の言語的な並べ替えがサポートされています。

  • 補助文字は、データベース オブジェクトの名前など、メタデータ内で使用することはできません。

  • SQL Server 2012 で導入された、補助文字 (SC) 照合順序の新しいファミリを、データ型 ncharnvarcharおよび sql_variantと共に使用できます。 たとえば、 Latin1_General_100_CI_AS_SCや、日本語の照合順序を使用する場合は Japanese_Bushu_Kakusu_100_CI_AS_SCを使用できます。

    SC フラグは、以下に適用できます。

    • バージョン 90 の Windows 照合順序

    • バージョン 100 の Windows 照合順序

    SC フラグは、以下には適用できません。

    • バージョン 80 バージョンなしの Windows 照合順序

    • BIN または BIN2 バイナリ照合順序

    • SQL* 照合順序

次の表では、一部の文字列関数と文字列演算子で、補助文字が SC 照合順序ありで使用される場合と SC 照合順序なしで使用される場合の動作を比較しています。

文字列関数または演算子 SC の照合順序あり SC の照合順序なし
CHARINDEX

LEN

PATINDEX
UTF-16 サロゲート ペアは、1 つのコード ポイントとしてカウントされます。 UTF-16 サロゲート ペアは、2 つのコード ポイントとしてカウントされます。
LEFT

REPLACE

REVERSE

RIGHT

SUBSTRING

STUFF
これらの関数は、各サロゲート ペアを 1 つのコード ポイントとして処理し、期待どおりに動作します。 これらの関数では、サロゲート ペアが分割され、予期しない結果が生じることがあります。
NCHAR 0 ~ 0x10FFFF の範囲の指定した Unicode コード ポイント値に対応する文字を返します。 指定された値が 0 ~ 0xFFFF の範囲内にある場合、1 つの文字だけが返されます。 値が大きい場合、対応するサロゲート ペアが返されます。 0 xFFFF よりも高い値の場合は、対応するサロゲートの代わりに NULL が返されます。
UNICODE 0 から 0x10FFFF の範囲の UTF-16 コード ポイントが返されます。 0 から 0xFFFF の範囲の UCS-2 コード ポイントが返されます。
1 文字に一致するワイルドカード

ワイルドカード - 一致しない文字列
補助文字は、すべてのワイルドカード操作でサポートされています。 補助文字は、これらのワイルドカード操作でサポートされていません。 その他のワイルドカード演算子がサポートされます。

GB18030 のサポート

GB18030 は中華人民共和国が単独で中国語の文字のエンコードに使用している標準規格です。 GB18030 文字の長さは 1 バイト、2 バイト、4 バイトのいずれかです。 SQL Server では、クライアント側アプリケーションからサーバーに GB18030 でエンコードした文字が入力されたときに文字を認識し、内部的には Unicode 文字に変換して格納することで GB18030 文字をサポートしています。 サーバーに格納された GB18030 文字は、それ以降の操作では Unicode 文字として処理されます。 任意の中国語の照合順序を使用できますが、最新の 100 バージョンの使用をお勧めします。 すべての _100 レベルの照合順序は、GB18030 文字の言語的な並べ替えをサポートしています。 データに補助文字 (サロゲート ペア) が含まれている場合は、SQL Server 2019 (15.x) で使用できる SC 照合順序を使用して、検索と並べ替えを改善できます。

複雑な文字表記のサポート

SQL Server は、複雑な文字表記の入力、格納、変更、および表示をサポートできます。 複雑な文字表記には、次の種類があります。

  • アラビア語テキストと英語テキストの組み合わせなど、右から左に記述されるテキストと左から右に記述されるテキストの両方の組み合わせを含む文字表記。

  • アラビア語、インド諸語、タイ語の文字など、位置によって、または別の種類の文字と組み合わせた場合に、文字が変形する文字表記。

  • タイ語など、単語間に区切りがないため、単語を識別するための内部辞書を必要とする言語。

SQL Server を操作するデータベース アプリケーションは、複雑な文字表記をサポートするコントロールを使用する必要があります。 マネージド コードで作成される標準の Windows フォーム コントロールは、複雑な文字表記を使用できます。

タスク トピック
SQL Server のインスタンスの照合順序を設定または変更する方法について説明します。 サーバーの照合順序の設定または変更
ユーザー データベースの照合順序を設定または変更する方法について説明します。 データベースの照合順序の設定または変更
データベース内の列の照合順序を設定または変更する方法について説明します。 列の照合順序の設定または変更
サーバー、データベース、または列のレベルでの照合順序の情報を取得する方法について説明します。 照合順序情報の表示
Transact-SQL ステートメントを、ある言語から別の言語に容易に移行したり、複数の言語を簡単にサポートしたりできるように記述する方法について説明します。 国際化に対応した Transact-SQL ステートメントの記述
エラー メッセージの言語と、日付、時刻、通貨データを使用および表示する際の設定を変更する方法について説明します。 セッション言語の設定

SQL Server ベスト プラクティス照合順序の変更

SQL Server ベスト プラクティス Unicode への移行

Unicode コンソーシアムの Web サイト

参照

包含データベースの照合順序
フルテキスト インデックス作成時の言語の選択
sys.fn_helpcollations (Transact-SQL)