데이터 정렬 선행 규칙Collation Precedence

적용 대상: 예SQL Server 예Azure SQL Database 예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 APPLIES 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.

데이터 정렬 선행 규칙은 다음과 같은 문자열 데이터 유형에만 적용됩니다. char, varchar, text, nchar, nvarcharntext.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 식의 값이 암시적 데이터 정렬 레이블의 서로 충돌하는 데이터 정렬을 가진 두 문자열 사이의 작업 결과임을 표시합니다.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

단 하나의 문자열 개체를 참조하는 단순 식의 데이터 정렬 레이블은 참조되는 개체의 데이터 정렬 레이블입니다.The collation label of a simple expression that references only one character string object is the collation label of the referenced object.

데이터 정렬 레이블이 같은 두 피연산자 식을 참조하는 복합 식의 데이터 정렬 레이블은 피연산자 식의 데이터 정렬 레이블입니다.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.

데이터 정렬 레이블이 다른 두 피연산자 식을 참조하는 복합 식의 최종 결과의 데이터 정렬 레이블은 다음 규칙에 따라 결정됩니다.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

  • 데이터 정렬이 다르게 할당된 두 명시적 식을 결합하면 오류가 발생합니다.Combining two Explicit expressions that have been assigned different collations generates an error:

    명시적 X + 명시적 Y = 오류Explicit X + Explicit Y = Error

  • 데이터 정렬이 다르게 할당된 두 암시적 식을 결합하면 데이터 정렬이 없는 식이 됩니다.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 결과는 명시적 YResult is Explicit Y 결과는 명시적 YResult is Explicit Y 결과는 명시적 YResult is Explicit Y
암시적 YImplicit Y 결과는 명시적 XResult is Explicit X 결과는 데이터 정렬 없음Result is No-collation 결과는 암시적 YResult is Implicit Y 결과는 데이터 정렬 없음Result is No-collation
Coercible-defaultCoercible-default 결과는 명시적 XResult is Explicit X 결과는 암시적 XResult is Implicit X 결과는 기본값 강제 변환Result is Coercible-default 결과는 데이터 정렬 없음Result is No-collation
데이터 정렬 없음No-collation 결과는 명시적 XResult 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

  • 텍스트 데이터 형식의 코드 페이지 변환은 허용되지 않습니다.Code page conversions for text data types are not allowed. 서로 다른 코드 페이지를 가진 경우 한 데이터 정렬에서 다른 데이터 정렬로 텍스트 식을 캐스팅할 수 없습니다.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' 식의 유니코드 데이터 형식은 우선 순위가 높은 데이터 형식입니다.The Unicode data type of the simple expression N'abc' has a higher data type precedence. 따라서 결과 식은 N'abc'에 할당된 유니코드 데이터 형식을 갖게 됩니다.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. 따라서 French_CI_ASCharCol 데이터 정렬이 사용됩니다.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 식에는 데이터 정렬 레이블이 없으므로 SELECT 목록에 표시할 수 없으며 데이터 정렬 인식 연산자로 연산할 수 없습니다.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.

문자열 연결 연산자는 데이터 정렬을 인식하며 두 문자열 피연산자와 결과에는 데이터 정렬 우선 순위가 가장 높은 피연산자의 데이터 정렬 레이블이 할당됩니다.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 함수는 char, varchartext 데이터 형식에 대해 데이터 정렬을 인식합니다.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 REPLACEREPLACE
DIFFERENCEDIFFERENCE REVERSEREVERSE
ISNUMERICISNUMERIC RIGHTRIGHT
LEFTLEFT SOUNDEXSOUNDEX
LENLEN STUFFSTUFF
LOWERLOWER SUBSTRINGSUBSTRING
PATINDEXPATINDEX UPPERUPPER

참고 항목See Also

COLLATE(Transact-SQL) COLLATE (Transact-SQL)
데이터 형식 변환(Database Engine) Data Type Conversion (Database Engine)
연산자(Transact-SQL) Operators (Transact-SQL)
식(Transact-SQL)Expressions (Transact-SQL)