10.1.7.5 식의 데이터 정렬
대다수의 문은 MySQL이 어떤 데이터 정렬을 사용하여 비교 연산을 할지는 명확되어 있습니다. 예를 들어, 다음의 경우에는 정렬 순서가 컬럼 charset_name
데이터 정렬 인 것은 분명하다.
SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T;
그러나 여러 피연산자가 있으면, 애매함이 발생할 수 있습니다. 예 :
SELECT x FROM T WHERE x = 'Y';
컬럼 x
의 데이터 정렬을 사용하여 비교하는 것이 좋을까요, 아니면 문자열 리터럴 'Y'
의 조합 순서를 사용하여 비교하는 편이 낫다 있을까요? x
와 'Y'
모두 데이터 정렬이 있습니다 만, 어느 데이터 정렬이 우선되는 것입니까?
표준 SQL에서는 "강제성"규칙이라고했던 방법으로 위의 문제를 해결하고 있습니다. MySQL은 다음과 같이 강제성 값을 할당합니다.
명시적인
COLLATE
절 강제성은 0입니다. (강제성이 전혀 없습니다.)데이터 정렬이 다른 2 개의 문자열을 연결하면 강제성은 1입니다.
열 또는 스토어드 루틴 파라미터 또는 로컬 변수의 데이터 정렬 강제성은 2입니다.
"시스템 상수 '(
USER()
또는VERSION()
등의 함수에서 반환되는 문자열)의 강제성은 3입니다.리터럴 데이터 정렬의 강제성은 4입니다.
NULL
또는NULL
에서 파생 된 식의 강제성 5입니다.
MySQL은 다음의 규칙과 함께 강제성 값을 사용하여 모호성을 해결합니다.
강제성 값이 가장 낮은 데이터 정렬을 사용합니다.
양쪽에서 강제성이 같은 경우는 다음과 같습니다.
두 측 Unicode인지 두 측 Unicode가 아닌 경우 오류가 발생합니다.
양쪽에 Unicode 캐릭터 세트가 있고 다른 한쪽에 Unicode 이외의 문자 세트가있는 경우, Unicode 캐릭터 세트의 측면이 우선되어 Unicode 이외의 측면에 자동 문자 집합 변환이 적용됩니다. 예를 들어, 다음 명령문은 오류를 반환하지 않습니다.
SELECT CONCAT (utf8_column, latin1_column) FROM t1;
이것은
utf8
문자 세트와utf8_column
와 같은 데이터 정렬을 포함하는 결과를 반환합니다. 연결하기 전에latin1_column
값은 자동으로utf8
로 변환됩니다.동일한 문자 집합 피연산자이지만
_bin
데이터 정렬과_ci
또는_cs
혼합 데이터 정렬 피연산자를 사용한 연산의 경우_bin
데이터 정렬이 사용됩니다. 이것은 대상이 데이터 타입이 아닌 데이터 정렬 인 점을 제외하면 비 이진 문자열 및 이진 문자열이 혼합 된 연산 피연산자가 바이너리 문자열로 평가되는 방법과 비슷합니다.
자동 변환 기능은 SQL 표준에는 포함되어 있지 않습니다. 그러나 어떤 문자 세트도 (지원되는 문자에 대해) Unicode의 "일부"임을 SQL 표준 문서에 기재되어 있습니다. "슈퍼 세트에 적용되는 것은 일부에도 적용된다"라고 잘 알려진 원칙이 있기 때문에 Unicode 데이터 정렬은 Unicode 이외의 문자열과 비교도 적용 할 수 있다고 생각합니다.
예 :
비교 | 사용되는 데이터 정렬 |
---|---|
column1 = 'A' | column1 의 데이터 정렬을 사용합니다 |
column1 = 'A' COLLATE x | 'A' COLLATE x 데이터 정렬을 사용합니다 |
column1 COLLATE x = 'A' COLLATE y | 오류 |
COERCIBILITY()
함수를 사용하면 문자열 식의 강제성을 확인할 수 있습니다.
mysql>SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
-> 0 mysql>SELECT COERCIBILITY(VERSION());
-> 3 mysql>SELECT COERCIBILITY('A');
-> 4
섹션 12.14 "정보 함수" 를 참조하십시오.
식 CONCAT(1, 'abc')
에서 인수 1
에 대해 수행되는 변환 등 숫자 또는 시간 값의 문자열로 암시 적 변환의 경우, 그 결과는 character_set_connection
및 collation_connection
시스템 변수로 지정된 문자 세트 및 데이터 정렬을 가진 문자 (비 바이너리) 열 수 있습니다. 섹션 12.2 "수식 계산에서의 타입 변환" 을 참조하십시오.