次の方法で共有


照合順序の優先順位

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

照合順序の優先順位 (照合順序強制規則とも呼ばれます) は、次の 2 つの結果を決定します。

  • 文字列として評価される式の最終的な結果の照合順序。

  • 文字列入力を使用するが、 LIKE や IN などの文字列を返さない照合順序に依存する演算子によって使用される照合順序。

照合順序の優先順位のルールは、charvarchartextncharnvarcharntext の各文字列データ型に対してのみ適用されます。 他のデータ型を持つオブジェクトは、照合順序の評価には参加しません。

照合順序ラベル

すべてのオブジェクトの照合順序は 4 つのカテゴリに分類されます。これらのカテゴリの一覧とその説明を以下の表に示します。 各カテゴリの名前は照合順序ラベルです。

照合順序ラベル オブジェクトの種類
Coercible-default Transact-SQL 文字列変数、パラメーター、リテラル、カタログ組み込み関数の出力、または文字列入力を受け取らずに文字列出力を生成する組み込み関数。

このオブジェクトが、ユーザー定義関数、ストアド プロシージャ、またはトリガー内で宣言されている場合、そのオブジェクトには、関数、ストアド プロシージャ、またはトリガーが作成されているデータベースの既定の照合順序が割り当てられます。 オブジェクトがバッチ内で宣言されている場合は、その接続に対する現在のデータベースの既定の照合順序が割り当てられます。
Implicit X 列参照です。 式の照合順序 (X) には、テーブルまたはビューの列に対して定義されている照合順序が使用されます。

COLLATE または CREATE TABLE ステートメントでCREATE VIEW句を使用して、列に照合順序が明示的に割り当てられた場合でも、列参照は暗黙的として分類されます。
Explicit X 式で COLLATE 句を使用して、特定の照合順序 (X) に明示的にキャストされる式。
No-collation 式の値が、2 つの文字列の照合順序ラベルが "暗黙" で、それぞれの照合順序が競合する場合のその文字列間の操作の結果であることを示します。 式の結果は、照合順序なしとして定義されます。

照合順序の規則

文字列オブジェクトを 1 つだけ参照する単純な式の場合、その式の照合順序ラベルには、参照先のオブジェクトの照合順序ラベルが使用されます。

同じ照合順序ラベルを持つ 2 つのオペランド式を参照する複雑な式の場合、その式の照合順序ラベルには、オペランド式の照合順序ラベルが使用されます。

異なる照合順序を持つ 2 つのオペランド式を参照する複雑な式の場合、最終的な結果の照合順序ラベルは、次のルールに基づいて決定されます。

  • 明示的な照合順序は、暗黙的な照合順序よりも優先されます。 暗黙的な照合順序は、強制可能な既定照合順序よりも優先されます。

    明示的 > 暗黙的 > 強制可能な既定照合順序

  • 異なる照合順序が割り当てられている 2 つの明示的な式を組み合わせると、エラーが発生します。

    明示的な照合順序 X + 明示的な照合順序 Y = エラー

  • 異なる照合順序を持つ 2 つの暗黙的な式を組み合わせると、照合順序なしになります。

    暗黙的な照合順序 X + 暗黙的な照合順序 Y = 照合順序なし

  • 照合順序なしの式と任意のラベルの式を組み合わせると、照合順序なしのラベルが生成されます。ただし、明示的な照合順序の場合は例外です。それについては次のルールを参照してください。

    照合順序なし + 任意 = 照合順序なし

  • 照合順序なしの式を、明示的な照合順序を持つ式と組み合わせると、明示的な照合順序のラベルを持つ式になります。

    照合順序なし + 明示的な照合順序 X = 明示的な照合順序

次の表は、ルールのまとめです。

オペランド強制ラベル 明示的な照合順序 X 暗黙的な照合順序 X 強制可能な既定照合順序 照合順序なし
Explicit Y エラーが生成されます。 結果は、明示的な照合順序 Y です。 結果は、明示的な照合順序 Y です。 結果は、明示的な照合順序 Y です。
Implicit Y 結果は明示的な照合順序 X です。 結果は、照合順序なしです。 結果は、暗黙的な照合順序 Y です。 結果は、照合順序なしです。
Coercible-default 結果は明示的な照合順序 X です。 結果は暗黙的な照合順序 X です。 結果は、強制可能な既定照合順序です。 結果は、照合順序なしです。
No-collation 結果は明示的な照合順序 X です。 結果は、照合順序なしです。 結果は、照合順序なしです。 結果は、照合順序なしです。

また、次の追加のルールも照合順序の優先順位に適用されます。

  • 既に明示的な式である式に複数の COLLATE 句を含めることはできません。 たとえば、既に明示的な式である式に対して COLLATE 句が指定されているため、次のWHERE句は無効です。

    WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS

  • テキスト データ型のコード ページ変換は許可されません。 異なるコード ページがある場合、ある照合順序から別の照合順序に テキスト 式をキャストすることはできません。 右側のテキスト オペランドの照合順序に左テキスト オペランドとは異なるコード ページがある場合、代入演算子は値を割り当てられません。

照合順序の優先順位の決定は、データ型変換の後に行われます。 結果の照合順序を提供するオペランドは、最終結果のデータ型を提供するオペランドと異なっていてもかまいません。 たとえば、次のバッチがあるとします。

CREATE TABLE TestTab
(
    PrimaryKey INT PRIMARY KEY,
    CharCol CHAR (10) COLLATE French_CI_AS
);

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc';

Note

nvarchar データ型は Fabric Warehouse ではサポートされていませんが、この記事のほとんどの例は UTF-8 と nvarchar を使用した varchar の両方に適用でき、特に明記されていない限り、Fabric Warehouse に適用できます。

N'abc' という単純な式の Unicode データ型は、データ型の優先順位が高いため、 その結果式には N'abc' に割り当てられている Unicode データ型が使用されます。 これに対し、式 CharCol は暗黙的な照合順序のラベルを持ち、N'abc' はそれよりも優先順位の低い強制可能な既定照合順序のラベルを持つため、 照合順序には、French_CI_AS の照合順序 CharCol が使用されます。

照合順序規則の例

照合順序ルールについて、以下の例で説明します。 この例を実行するには、次に示すテスト テーブルを作成します。

USE tempdb;
GO

CREATE TABLE TestTab
(
    id INT,
    GreekCol NVARCHAR (10) COLLATE greek_ci_as,
    LatinCol NVARCHAR (10) COLLATE latin1_general_cs_as
);

INSERT TestTab
VALUES (1, N'A', N'a');
GO

照合順序の競合とエラー

次のクエリの述語に照合順序の競合が発生し、エラーが生成されます。

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;

結果セットは次のとおりです。

Msg 448, Level 16, State 9, Line 2
Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.

明示的なラベルと暗黙的なラベル

次のクエリの述語は、右側の式が明示ラベルを持っているので、照合順序 greek_ci_as で評価されます。 右側の式の明示ラベルは、左側の式の暗黙ラベルよりも優先されます。

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

結果セットは次のとおりです。

id          GreekCol             LatinCol
----------- -------------------- --------------------
          1 A                    a

照合順序ラベルなし

Note

UTF-8 照合順序での nvarcharvarchar の動作の違いのため、この例は Fabric Warehouse には適用されません。

次のクエリの CASE 式には照合順序なしラベルがあるため、選択リストに表示したり、照合順序に依存する演算子で操作したりすることはできません。 ただし、この式を、照合順序非依存の演算子を使用して処理することはできます。

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;

結果セットは次のとおりです。

Msg 451, Level 16, State 1, Line 1
Cannot resolve collation conflict for column 1 in SELECT statement.
SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')
FROM TestTab;

結果セットは次のとおりです。

Msg 446, Level 16, State 9, Server LEIH2, Line 1
Cannot resolve collation conflict for patindex operation.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS
FROM TestTab;

結果セットは次のとおりです。

--------------------
a

照合順序の機密性が高く、照合順序が区別されない

演算子と関数は、照合順序依存または非依存のいずれかです。

  • 照合順序の機密性: これは、照合順序なしオペランドを指定するとコンパイル時エラーであることを意味します。 式の結果を照合順序なしにすることはできません。
  • 照合順序を区別しない: これは、オペランドと結果を照合順序なしにできることを意味します。

演算子と照合順序

比較演算子と、 MAXMINBETWEENLIKE、および IN 演算子は照合順序に依存します。 これらの演算子で使用される文字列には、優先順位の高い方のオペランドの照合順序ラベルが割り当てられます。 UNION ステートメントは照合順序も区別され、すべての文字列オペランドと最終的な結果には、最も優先順位の高いオペランドの照合順序が割り当てられます。 UNIONオペランドと結果の照合順序の優先順位は、列ごとに評価されます。

代入演算子は照合順序非依存で、右側の式が左側の照合順序にキャストされます。

文字列連結演算子は照合順序依存で、2 つの文字列オペランドとその結果には、最高の優先順位を持つオペランドの照合順序ラベルが割り当てられます。 UNION ALLステートメントと CASE ステートメントは照合順序を区別せず、すべての文字列オペランドと最終的な結果には、最も優先順位の高いオペランドの照合順序ラベルが割り当てられます。 UNION ALLオペランドと結果の照合順序の優先順位は、列ごとに評価されます。

関数と照合順序

CASTCONVERT、およびCOLLATE関数は、文字varcharおよびテキストのデータ型の照合順序に依存します。 CAST関数とCONVERT関数の入力と出力が文字列の場合、出力文字列には入力文字列の照合順序ラベルが付けられます。 入力が文字列でない場合、出力文字列は Coercible の既定値であり、接続の現在のデータベースの照合順序、または CAST または CONVERT が参照されるユーザー定義関数、ストアド プロシージャ、またはトリガーを含むデータベースが割り当てられます。

文字列を返すが、文字列入力を受け取らない組み込み関数の場合、結果の文字列は Coercible-default です。 結果文字列には、現在のデータベースの照合順序、または関数が参照されるユーザー定義関数、ストアド プロシージャ、またはトリガーを含むデータベースの照合順序が割り当てられます。

次の関数は、照合順序依存です。その出力文字列は、入力文字列の照合順序ラベルを持ちます。

  • CHARINDEX
  • DIFFERENCE
  • ISNUMERIC
  • LEFT
  • LEN
  • LOWER
  • PATINDEX
  • REPLACE
  • REVERSE
  • RIGHT
  • SOUNDEX
  • STUFF
  • SUBSTRING
  • UPPER