次の方法で共有


照合順序と Unicode のサポート

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 によって同じものと見なされます。 Kana非感受性を指定する唯一の方法は、このオプションを省略することです。
文字幅を区別する (_WS) 全角文字と半角文字を区別します。 このオプションが選択されていない場合、SQL Server では、並べ替えのために、同じ文字の全幅表現と半角表現が同一であると見なされます。 文字幅を区別しないように指定する唯一の方法は、このオプションを省略することです。

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 データ型のバイナリ照合順序の場合、ロケールはデータの並べ替えでは考慮されません。 たとえば、Latin_1_General_BINとJapanese_BINは、Unicode データで使用されている場合に同じ並べ替え結果を生成します。

SQL Server には 2 種類のバイナリ照合順序があります。以前の BIN 照合順序と新しい BIN2 照合順序。 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;  

ロケール (地域設定)

ロケールは、場所またはカルチャに関連付けられている情報のセットです。 これには、音声言語の名前と識別子、言語の記述に使用されるスクリプト、カルチャ規則を含めることができます。 照合順序は、1 つ以上のロケールに関連付けることができます。 詳細については、「 Microsoft によって割り当てられているロケール ID」を参照してください。

コード ページ

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

並べ替え順序

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

Unicode のサポート

Unicode は、コード ポイントを文字にマップするための標準です。 世界のすべての言語のすべての文字をカバーするように設計されているため、異なるコード ページで異なる文字セットを処理する必要はありません。 複数の言語を反映する文字データを格納する場合は、Unicode 以外のデータ型 (charvarchartext) ではなく、常に Unicode データ型 (ncharnvarcharntext) を使用します。

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

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

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

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

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

Unicode または非 Unicode データ型の使用に関連する問題点を評価するには、使用環境におけるパフォーマンスの違いを測定するためのシナリオをテストする必要があります。 組織全体のシステムで使用される照合順序を標準化し、可能な限り Unicode サーバーとクライアントを展開することをお勧めします。

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

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

  • DB-Library および ODBC バージョン 3.6 以前のバージョンを使用する Unicode 以外のクライアント

次の表では、Unicode サーバーと非 Unicode サーバーのさまざまな組み合わせで多言語データを使用する方法について説明します。

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

補助文字

SQL Server には、Unicode データを格納するための ncharnvarchar などのデータ型が用意されています。 これらのデータ型は、 UTF-16 という形式でテキストをエンコードします。 Unicode コンソーシアムは、各文字に一意のコードポイントを割り当てます。これは、0x10FFFFに0x0000範囲の値です。 最も頻繁に使用される文字には、メモリとディスク上の 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 照合順序なし
CHARINDEX

2013

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


取り替える

反転



サブストリング

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

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

GB18030 サポート

GB18030は、中国語の文字をエンコードするために中華人民共和国で使用される別の標準です。 GB18030 文字の長さは 1 バイト、2 バイト、4 バイトのいずれかです。 SQL Server では、クライアント側アプリケーションからサーバーに GB18030 でエンコードした文字が入力されたときに文字を認識し、内部的には Unicode 文字に変換して格納することで 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 Best Practices Migration to Unicode" (SQL Server のベスト プラクティスの Unicode への移行)

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

こちらもご覧ください

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