10.1.8 문자열의 레퍼토리
문자 세트 레퍼토리는 그 세트의 문자 집합입니다.
문자열 식에는 레퍼토리 특성이 있고, 그 값은 다음 두 가지입니다.
ASCII
:U+0000
부터U+007F
의 Unicode 범위 내의 문자를 식에 포함 할 수 있습니다.UNICODE
:U+0000
부터U+FFFF
의 Unicode 범위 내의 문자를 식에 포함 할 수 있습니다.
ASCII
범위는 UNICODE
범위의 부분 집합이기 때문에, ASCII
레퍼토리 문자열은 UNICODE
레퍼토리 문자열의 문자 세트 또는 ASCII
의 수퍼 세트 인 문자 집합에 정보를 잃지 않고 안전하게 변환 할 수 있습니다. (모든 MySQL 문자 세트는 스웨덴어로 악센트 부호가있는 문자 일부 구두점 문자를 다시 사용하는 swe7
를 제외하고는 ASCII
의 수퍼 세트입니다.) MySQL에서 "데이터 정렬 악성 혼합"오류가 반환된다 같은 많은 경우에도 레퍼토리를 사용하면 표현식의 문자 집합을 변환 할 수 있습니다.
다음의 설명에서 수식과 그 레퍼토리의 예를 들어 레퍼토리를 사용해서 문자열 식의 평가가 어떻게 달라지는지를 보여줍니다.
문자열 상수의 레퍼토리는 문자열의 내용에 따라 다릅니다.
SET NAMES utf8; SELECT 'abc'; SELECT _utf8'def '; SELECT N'MySQL ';
위의 각각의 경우에 문자 집합은
utf8
이지만, 실제로는 ASCII 범위 밖의 문자는 하나도 문자열에 포함되어 있지 않기 때문에, 그 레퍼토리는UNICODE
가 아닌ASCII
입니다.ascii
문자 집합을 포함 컬럼은 문자 집합을 위해ASCII
레퍼토리가 있습니다. 다음 테이블에서는c1
에는ASCII
레퍼토리가 있습니다.CREATE TABLE t1 (c1 CHAR (1) CHARACTER SET ascii);
다음 예제에서는 레퍼토리가 없을 때 오류가 발생하는 경우 레퍼토리에 의해 어떻게 결과가 요구되게 될지를 보여줍니다.
CREATE TABLE t1 ( c1 CHAR (1) CHARACTER SET latin1, c2 CHAR (1) CHARACTER SET ascii ); INSERT INTO t1 VALUES ( 'a', 'b'); SELECT CONCAT (c1, c2) FROM t1;
레퍼토리가없는 경우 다음과 같은 오류가 발생합니다.
ERROR 1267 (HY000) : Illegal mix of collations (latin1_swedish_ci, IMPLICIT) and (ascii_general_ci, IMPLICIT) for operation 'concat'
레퍼토리를 사용하면 일부에서 슈퍼 세트에 (
ascii
에서latin1
로) 변환을 할 수 있고 결과가 반환됩니다.+---------------+ | CONCAT(c1,c2) | +---------------+ | ab | +---------------+
1 개의 문자열 인수를 가지는 함수는 인수의 레퍼토리를 상속합니다.
UPPER(_utf8'
의 경우, 인수abc
')ASCII
레퍼토리가 있기 때문에, 그 결과는ASCII
레퍼토리가 존재합니다.문자열을 반환하는 문자열 인수를 가지지 않고, 결과 문자 세트로
character_set_connection
를 사용하는 함수의 경우, 결과의 레퍼토리는character_set_connection
이ascii
이면ASCII
로, 그 이외의 경우는UNICODE
입니다.FORMAT (
numeric_column
4);레퍼토리를 사용할지 여부에 따라 MySQL이 다음 예제를 어떻게 평가하는지가 달라집니다.
SET NAMES ascii; CREATE TABLE t1 (a INT, b VARCHAR (10) CHARACTER SET latin1); INSERT INTO t1 VALUES (1, 'b'); SELECT CONCAT (FORMAT (a, 4), b) FROM t1;
레퍼토리가없는 경우 다음과 같은 오류가 발생합니다.
ERROR 1267 (HY000) : Illegal mix of collations (ascii_general_ci, COERCIBLE) and (latin1_swedish_ci, IMPLICIT) for operation 'concat'
레퍼토리를 사용하면 다음과 같은 결과가 반환됩니다.
+-------------------------+ | CONCAT(FORMAT(a, 4), b) | +-------------------------+ | 1.0000b | +-------------------------+
2 개 이상의 문자열 인수를 가지는 함수는 결과의 레퍼토리로 "가장 범위가 넓은 '인수 레퍼토리를 사용합니다 (
UNICODE
는ASCII
보다 범위가 넓어집니다). 다음CONCAT()
호출을 생각해 보겠습니다.CONCAT (_ucs2 0x0041, _ucs2 0x0042) CONCAT (_ucs2 0x0041, _ucs2 0x00C2)
첫 번째 호출에서는 두 인수가
ascii
문자 집합의 범위 내에 있으므로 레퍼토리는ASCII
입니다. 두 번째 호출에서는 2 번째의 인수가ascii
문자 세트 범위를 벗어나 있기 때문에 레퍼토리는UNICODE
입니다.함수의 반환 값의 레퍼토리는 결과의 문자 집합 및 정렬 순서에 영향을주는 인자의 레퍼토리에만 따라 정해져 있습니다.
IF (column1 <column2 'smaller', 'greater')
결과의 레퍼토리는 2 개의 문자열 인수 (두 번째 인수와 세번째 인자)가 모두
ASCII
레퍼토리이므로ASCII
입니다. 첫 번째 인수는 식으로 문자열 값을 사용하는 경우에도 결과의 레퍼토리에 중요하지 않습니다.