照合順序の優先順位Collation Precedence

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

照合順序の優先順位は、照合順序強制適用ルールとも呼ばれ、次の照合順序を決定します。Collation precedence, also known as collation coercion rules, determines the following:

  • 文字列として評価される式の最終的な結果の照合順序。The collation of the final result of an expression that is evaluated to a character string.

  • LIKE、IN など、入力として文字列を使用するが文字列を返さない、照合順序依存の演算子によって使用される照合順序The collation that is used by collation-sensitive operators that use character string inputs but do not return a character string, such as LIKE and IN.

照合順序の優先順位のルールは、charvarchartextncharnvarcharntext の各文字列データ型に対してのみ適用されます。The collation precedence rules apply only to the character string data types: char, varchar, text, nchar, nvarchar, and ntext. 他のデータ型のオブジェクトは、照合順序の評価の対象にはなりません。Objects that have other data types do not participate in collation evaluations.

照合順序ラベルCollation Labels

すべてのオブジェクトの照合順序は 4 つのカテゴリに分類されます。これらのカテゴリの一覧とその説明を以下の表に示します。The following table lists and describes the four categories in which the collations of all objects are identified. 各カテゴリの名前を、照合順序ラベルと呼びます。The name of each category is called the collation label.

照合順序ラベルCollation label オブジェクトの種類Types of objects
強制可能な既定照合順序Coercible-default 任意の Transact-SQLTransact-SQL 文字列変数、パラメーター、リテラル、カタログの組み込み関数の出力、または入力に文字列を使用しないが文字列を出力する組み込み関数の出力です。Any Transact-SQLTransact-SQL character string variable, parameter, literal, or the output of a catalog built-in function, or a built-in function that does not take string inputs but produces a string output.

このオブジェクトが、ユーザー定義関数、ストアド プロシージャ、またはトリガー内で宣言されている場合、そのオブジェクトには、関数、ストアド プロシージャ、またはトリガーが作成されているデータベースの既定の照合順序が割り当てられます。If the object is declared in a user-defined function, stored procedure, or trigger, the object is assigned the default collation of the database in which the function, stored procedure, or trigger is created. オブジェクトがバッチ内で宣言されている場合は、その接続に対する現在のデータベースの既定の照合順序が割り当てられます。If the object is declared in a batch, the object is assigned the default collation of the current database for the connection.
暗黙的な照合順序 XImplicit X 列参照です。A column reference. 式の照合順序 (X) には、テーブルまたはビューの列に対して定義されている照合順序が使用されます。The collation of the expression (X) is taken from the collation defined for the column in the table or view.

CREATE TABLE または CREATE VIEW ステートメントの COLLATE 句を使用して列に明示的に照合順序を割り当てても、その列参照は "暗黙" として分類されます。Even if the column was explicitly assigned a collation by using a COLLATE clause in the CREATE TABLE or CREATE VIEW statement, the column reference is classified as implicit.
明示的な照合順序 XExplicit X 式の中で、COLLATE 句を使用して特定の照合順序 (X) に明示的にキャストされる式です。An expression that is explicitly cast to a specific collation (X) by using a COLLATE clause in the expression.
照合順序なしNo-collation 式の値が、2 つの文字列の照合順序ラベルが "暗黙" で、それぞれの照合順序が競合する場合のその文字列間の操作の結果であることを示します。Indicates that the value of an expression is the result of an operation between two strings that have conflicting collations of the implicit collation label. 式の結果は、照合順序なしとして定義されます。The expression result is defined as not having a collation.

照合順序ルールCollation Rules

文字列オブジェクトを 1 つだけ参照する単純な式の場合、その式の照合順序ラベルには、参照先のオブジェクトの照合順序ラベルが使用されます。The collation label of a simple expression that references only one character string object is the collation label of the referenced object.

同じ照合順序ラベルを持つ 2 つのオペランド式を参照する複雑な式の場合、その式の照合順序ラベルには、オペランド式の照合順序ラベルが使用されます。The collation label of a complex expression that references two operand expressions with the same collation label is the collation label of the operand expressions.

異なる照合順序を持つ 2 つのオペランド式を参照する複雑な式の場合、最終的な結果の照合順序ラベルは、次のルールに基づいて決定されます。The collation label of the final result of a complex expression that references two operand expressions with different collations is based on the following rules:

  • 明示的な照合順序は、暗黙的な照合順序よりも優先されます。Explicit takes precedence over implicit. 暗黙的な照合順序は、強制可能な既定照合順序よりも優先されます。Implicit takes precedence over Coercible-default:

    明示的な照合順序 > 暗黙的な照合順序 > 強制可能な既定照合順序Explicit > Implicit > Coercible-default

  • 異なる照合順序が割り当てられている 2 つの明示的な式を組み合わせると、エラーが発生します。Combining two Explicit expressions that have been assigned different collations generates an error:

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

  • 異なる照合順序を持つ 2 つの暗黙的な式を組み合わせると、照合順序なしになります。Combining two Implicit expressions that have different collations yields a result of No-collation:

    暗黙的な照合順序 X + 暗黙的な照合順序 Y = 照合順序なしImplicit X + Implicit Y = No-collation

  • 照合順序なしの式と任意のラベルの式を組み合わせると、照合順序なしのラベルが生成されます。ただし、明示的な照合順序の場合は例外です。それについては次のルールを参照してください。Combining an expression with No-collation with an expression of any label, except Explicit collation (see the following rule), yields a result that has the No-collation label:

    照合順序なし + 任意 = 照合順序なしNo-collation + anything = No-collation

  • 照合順序なしの式を、明示的な照合順序を持つ式と組み合わせると、明示的な照合順序のラベルを持つ式になります。Combining an expression with No-collation with an expression that has an Explicit collation, yields an expression with an Explicit label:

    照合順序なし + 明示的な照合順序 X = 明示的な照合順序No-collation + Explicit X = Explicit

次の表は、ルールのまとめです。The following table summarizes the rules.

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

また、次の追加のルールも照合順序の優先順位に適用されます。The following additional rules also apply to collation precedence:

  • 式で明示的に照合順序が指定されている場合、その式にさらに COLLATE 句を指定することはできません。You cannot have multiple COLLATE clauses on an expression that is already an explicit expression. たとえば、次の WHERE 句は、既に明示的に照合順序が指定されている式に対して COLLATE 句が指定されているため、不正な式となります。For example, the following WHERE clause is not valid because a COLLATE clause is specified for an expression that is already an explicit expression:

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

  • text 型で使用されるコード ページは変換できません。Code page conversions for text data types are not allowed. text 式の照合順序をキャストする場合、キャスト前とキャスト後の照合順序のコード ページが異なると、キャストできません。You cannot cast a text expression from one collation to another if they have the different code pages. 代入演算子を使用する場合、右側のテキスト オペランドの照合順序のコードページが左側のテキスト オペランドのコード ページと異なると、代入演算子は値を割り当てることができません。The assignment operator cannot assign values when the collation of the right text operand has a different code page than the left text operand.

照合順序の優先順位の決定は、データ型変換の後に行われます。Collation precedence is determined after data type conversion. 結果の照合順序を提供するオペランドは、最終結果のデータ型を提供するオペランドと異なっていてもかまいません。The operand from which the resulting collation is taken can be different from the operand that supplies the data type of the final result. たとえば、次のバッチがあるとします。For example, consider the following batch:

CREATE TABLE TestTab  
   (PrimaryKey int PRIMARY KEY,  
    CharCol char(10) COLLATE French_CI_AS  
   )  
  
SELECT *  
FROM TestTab  
WHERE CharCol LIKE N'abc'  

N'abc' という単純な式の Unicode データ型は、データ型の優先順位が高いため、The Unicode data type of the simple expression N'abc' has a higher data type precedence. その結果式には N'abc' に割り当てられている Unicode データ型が使用されます。Therefore, the resulting expression has the Unicode data type assigned to N'abc'. これに対し、式 CharCol は暗黙的な照合順序のラベルを持ち、N'abc' はそれよりも優先順位の低い強制可能な既定照合順序のラベルを持つため、However, the expression CharCol has a collation label of Implicit, and N'abc' has a lower coercion label of Coercible-default. 照合順序には、CharCol の照合順序 French_CI_AS が使用されます。Therefore, the collation that is used is the French_CI_AS collation of CharCol.

照合順序ルールの例Examples of Collation Rules

照合順序ルールについて、以下の例で説明します。The following examples show how the collation rules work. この例を実行するには、次に示すテスト テーブルを作成します。To run the examples, create the following test table.

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  

照合順序の競合とエラーCollation Conflict and Error

次のクエリの述語に照合順序の競合が発生し、エラーが生成されます。The predicate in the following query has collation conflict and generates an error.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

以下に結果セットを示します。Here is the result set.

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.  

明示ラベルと暗黙ラベルExplicit Label vs. Implicit Label

次のクエリの述語は、右側の式が明示ラベルを持っているので、照合順序 greek_ci_as で評価されます。The predicate in the following query is evaluated in collation greek_ci_as because the right expression has the Explicit label. 右側の式の明示ラベルは、左側の式の暗黙ラベルよりも優先されます。This takes precedence over the Implicit label of the left expression.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

以下に結果セットを示します。Here is the result set.

id          GreekCol             LatinCol  
----------- -------------------- --------------------  
          1 A                    a  
  
(1 row affected)  

照合順序なしのラベルNo-Collation Labels

次のクエリの CASE 式の照合順序ラベルは、照合順序なしです。したがって、この式を選択リストに指定したり、照合順序依存の演算子によって処理することはできません。The CASE expressions in the following queries have a No-collation label; therefore, they cannot appear in the select list or be operated on by collation-sensitive operators. ただし、この式を、照合順序非依存の演算子を使用して処理することはできます。However, the expressions can be operated on by collation-insensitive operators.

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

以下に結果セットを示します。Here is the result set.

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;  

以下に結果セットを示します。Here is the result set.

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;  

以下に結果セットを示します。Here is the result set.

--------------------  
a  
  
(1 row affected)  

照合順序依存と照合順序非依存Collation Sensitive and Collation Insensitive

演算子と関数は、照合順序依存または非依存のいずれかです。Operators and functions are either collation sensitive or insensitive.

照合順序依存Collation sensitive
照合順序依存とは、照合順序なしのオペランドを指定するとコンパイル時にエラーとなることを意味します。This means that specifying a No-collation operand is a compile-time error. その式の結果を、照合順序なしに指定することはできません。The expression result cannot be No-collation.

照合順序非依存Collation insensitive
照合順序非依存とは、そのオペランドと結果を照合順序なしに指定できることを意味します。This means that the operands and result can be No-collation.

演算子と照合順序Operators and Collation

比較演算子、および MAX、MIN、BETWEEN、LIKE、IN の各演算子は、照合順序依存です。The comparison operators, and the MAX, MIN, BETWEEN, LIKE, and IN operators, are collation sensitive. これらの演算子で使用される文字列には、優先順位の高い方のオペランドの照合順序ラベルが割り当てられます。The string used by the operators is assigned the collation label of the operand that has the higher precedence. また、UNION ステートメントも照合順序依存で、すべての文字列オペランドおよび最終結果には、最高の優先順位を持つオペランドの照合順序が割り当てられます。The UNION statement is also collation sensitive, and all string operands and the final result is assigned the collation of the operand with the highest precedence. UNION オペランドと結果の照合順序の優先順位は、列ごとに評価されます。The collation precedence of the UNION operand and result are evaluated column by column.

代入演算子は照合順序非依存で、右側の式が左側の照合順序にキャストされます。The assignment operator is collation insensitive and the right expression is cast to the left collation.

文字列連結演算子は照合順序依存で、2 つの文字列オペランドとその結果には、最高の優先順位を持つオペランドの照合順序ラベルが割り当てられます。The string concatenation operator is collation sensitive, the two string operands and the result are assigned the collation label of the operand with the highest collation precedence. UNION ALL および CASE ステートメントは照合順序非依存で、すべての文字列オペランドとその最終結果には、最高の優先順位を持つオペランドの照合順序ラベルが割り当てられます。The UNION ALL and CASE statements are collation insensitive, and all string operands and the final results are assigned the collation label of the operand with the highest precedence. UNION ALL オペランドと結果の照合順序の優先順位は、列ごとに評価されます。The collation precedence of the UNION ALL operands and result are evaluated column by column.

関数と照合順序Functions and Collation

CAST、CONVERT、および COLLATE の各関数は、charvarchartext の各データ型に関して照合順序依存です。THE CAST, CONVERT, and COLLATE functions are collation sensitive for char, varchar, and text data types. CAST 関数および CONVERT 関数の入出力が文字列である場合、出力文字列は、入力文字列の照合順序ラベルを持ちます。If the input and output of the CAST and CONVERT functions are character strings, the output string has the collation label of the input string. 入力が文字列ではない場合、出力文字列は強制可能な既定照合順序となり、その接続の現在のデータベースの照合順序、あるいは CAST または CONVERT を参照しているユーザー定義関数、ストアド プロシージャ、またはトリガーを含むデータベースの照合順序が割り当てられます。If the input is not a character string, the output string is Coercible-default and assigned the collation of the current database for the connection, or the database that contains the user-defined function, stored procedure, or trigger in which the CAST or CONVERT is referenced.

入力が文字列ではなく文字列を返す組み込み関数の場合、その結果文字列は強制可能な既定照合順序となり、現在のデータベースの照合順序、あるいはその関数を参照しているユーザー定義関数、ストアド プロシージャ、またはトリガーを含むデータベースの照合順序が割り当てられます。For the built-in functions that return a string but do not take a string input, the result string is Coercible-default and is assigned either the collation of the current database, or the collation of the database that contains the user-defined function, stored procedure, or trigger in which the function is referenced.

次の関数は、照合順序依存です。その出力文字列は、入力文字列の照合順序ラベルを持ちます。The following functions are collation-sensitive and their output strings have the collation label of the input string:

CHARINDEXCHARINDEX [REPLACE]REPLACE
DIFFERENCEDIFFERENCE REVERSEREVERSE
ISNUMERICISNUMERIC RIGHTRIGHT
LEFTLEFT SOUNDEXSOUNDEX
LENLEN STUFFSTUFF
[LOWER]LOWER [SUBSTRING]SUBSTRING
PATINDEXPATINDEX [UPPER]UPPER

参照See Also

COLLATE (Transact-SQL) COLLATE (Transact-SQL)
データ型の変換 (データベース エンジン) Data Type Conversion (Database Engine)
演算子 (Transact-SQL) Operators (Transact-SQL)
式 (Transact-SQL)Expressions (Transact-SQL)