Loading...
MySQL 9.5 Reference Manual 9.5의 12.2.1 Character Set Repertoire의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
character set의 repertoire는 그 집합에 포함된 문자들의 모음입니다.
문자열 expression은 repertoire 속성을 가지며, 이 속성은 두 가지 값 중 하나를 가질 수 있습니다:
ASCII: expression은 ASCII 문자만 포함할 수 있습니다. 즉, Unicode 범위
U+0000부터 U+007F 사이의 문자입니다.
UNICODE: expression은 Unicode 범위 U+0000부터
U+10FFFF 사이의 문자를 포함할 수 있습니다. 여기에는 Basic Multilingual Plane (BMP) 범위
(U+0000부터 U+FFFF)의 문자와, BMP 범위 밖의 supplementary 문자
(U+10000부터 U+10FFFF)가 포함됩니다.
ASCII 범위는 UNICODE 범위의 부분집합이므로,
ASCII repertoire를 가진 문자열은 정보 손실 없이
UNICODE repertoire를 가진 어떤 문자열의 character set으로든 안전하게 변환될 수 있습니다.
또한 ascii character set의 상위 집합인 어떤 character set으로도
안전하게 변환될 수 있습니다. (모든 MySQL character set은 swe7을 제외하고는
ascii의 상위 집합입니다. swe7은 일부 punctuation 문자를
Swedish 강조 문자 용으로 재사용합니다.)
repertoire를 사용하면, collation coercibility에 대한 규칙만으로는 모호성을 해결하기에 부족한 많은 경우에 expression에서 character set 변환을 가능하게 하여, 그렇지 않으면 MySQL이 “illegal mix of collations” 에러를 반환했을 상황을 처리할 수 있습니다. (coercibility에 대한 정보는 Section 12.8.4, “Collation Coercibility in Expressions”를 참조하십시오.)
다음 설명에서는 expression과 그 repertoire의 예를 제공하고, repertoire의 사용이 문자열 expression 평가를 어떻게 변경하는지 설명합니다:
1SET NAMES utf8mb4; SELECT 'abc'; 2SELECT _utf8mb4'def';
위의 각 경우에서 character set은 utf8mb4이지만,
문자열에는 실제로 ASCII 범위를 벗어나는 어떤 문자도 포함되어 있지 않으므로,
그 repertoire는 UNICODE가 아니라 ASCII입니다.
ascii character set을 가지는 column은 그 character set 때문에
ASCII repertoire를 가집니다. 다음 table에서 c1은
ASCII repertoire를 가집니다:1CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET ascii);
다음 예는 repertoire가 없을 경우에는 에러가 발생하는 상황에서, repertoire가 결과를 어떻게 결정할 수 있게 하는지 보여 줍니다:
1CREATE TABLE t1 ( 2 c1 CHAR(1) CHARACTER SET latin1, 3 c2 CHAR(1) CHARACTER SET ascii 4); 5INSERT INTO t1 VALUES ('a','b'); 6SELECT CONCAT(c1,c2) FROM t1;
repertoire가 없으면 다음과 같은 에러가 발생합니다:
1ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) 2and (ascii_general_ci,IMPLICIT) for operation 'concat'
repertoire를 사용하면, 부분집합에서 상위 집합으로의
(ascii에서 latin1으로의)
변환이 일어날 수 있고, 결과가 반환됩니다:
1+---------------+ 2| CONCAT(c1,c2) | 3+---------------+ 4| ab | 5+---------------+
하나의 string 인수를 가지는 function은 그 인수의 repertoire를 상속합니다.
UPPER(_utf8mb4'abc')의 결과는,
그 인수가 ASCII repertoire를 가지기 때문에 ASCII repertoire를 가집니다.
(_utf8mb4 introducer가 있음에도 불구하고, 문자열 'abc'는
ASCII 범위를 벗어나는 어떤 문자도 포함하지 않습니다.)
문자열을 반환하지만 string 인수는 가지지 않고,
결과 character set으로
character_set_connection을 사용하는 function의 경우,
만약 character_set_connection이
ascii이면 결과 repertoire는 ASCII이고, 그렇지 않으면
UNICODE입니다:
1FORMAT(numeric_column, 4);
repertoire의 사용은 MySQL이 다음 예를 평가하는 방식을 변경합니다:
1SET NAMES ascii; 2CREATE TABLE t1 (a INT, b VARCHAR(10) CHARACTER SET latin1); 3INSERT INTO t1 VALUES (1,'b'); 4SELECT CONCAT(FORMAT(a, 4), b) FROM t1;
repertoire가 없으면 다음과 같은 에러가 발생합니다:
1ERROR 1267 (HY000): Illegal mix of collations (ascii_general_ci,COERCIBLE) 2and (latin1_swedish_ci,IMPLICIT) for operation 'concat'
repertoire가 있으면 결과가 반환됩니다:
1+-------------------------+ 2| CONCAT(FORMAT(a, 4), b) | 3+-------------------------+ 4| 1.0000b | 5+-------------------------+
UNICODE가 ASCII보다 더 넓습니다.
다음 CONCAT() 호출을 보십시오:1CONCAT(_ucs2 X'0041', _ucs2 X'0042') 2CONCAT(_ucs2 X'0041', _ucs2 X'00C2')
첫 번째 호출의 경우, 두 인수가 모두 ASCII 범위 내에 있으므로 repertoire는
ASCII입니다. 두 번째 호출의 경우, 두 번째 인수가 ASCII 범위를
벗어나 있으므로 repertoire는 UNICODE입니다.
1IF(column1 < column2, 'smaller', 'greater')
결과 repertoire는 ASCII입니다. 왜냐하면 두 개의 string 인수
(두 번째 인수와 세 번째 인수)가 모두 ASCII repertoire를
가지기 때문입니다. 첫 번째 인수는, expression이 문자열 값을 사용하더라도,
결과 repertoire에는 영향을 미치지 않습니다.
12.2 Character Sets and Collations in MySQL
12.2.2 UTF-8 for Metadata