Loading...
MySQL 9.5 Reference Manual 9.5의 12.14.1 Collation Implementation Types의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL은 여러 유형의 collation을 구현합니다:
8-bit character set을 위한 단순 collation
이러한 종류의 collation은 문자 코드에서 weight로의 일대일 매핑을 정의하는 256개 weight의 배열을 사용하여 구현됩니다. latin1_swedish_ci가 그 예입니다.
이는 대소문자를 구분하지 않는 collation이므로, 어떤 문자에 대해서든 대문자와 소문자의 weight가 동일하며 비교 시 동일하다고 간주됩니다.
1mysql> SET NAMES 'latin1' COLLATE 'latin1_swedish_ci'; 2Query OK, 0 rows affected (0.01 sec) 3 4mysql> SELECT HEX(WEIGHT_STRING('a')), HEX(WEIGHT_STRING('A')); 5+-------------------------+-------------------------+ 6| HEX(WEIGHT_STRING('a')) | HEX(WEIGHT_STRING('A')) | 7+-------------------------+-------------------------+ 8| 41 | 41 | 9+-------------------------+-------------------------+ 101 row in set (0.01 sec) 11 12mysql> SELECT 'a' = 'A'; 13+-----------+ 14| 'a' = 'A' | 15+-----------+ 16| 1 | 17+-----------+ 181 row in set (0.12 sec)
구현 방법에 대한 지침은 Section 12.14.3, “Adding a Simple Collation to an 8-Bit Character Set”를 참조하십시오.
8-bit character set을 위한 복잡한 collation
이러한 종류의 collation은 C 소스 파일의 함수들을 사용하여 구현되며, 이 함수들은 Section 12.13, “Adding a Character Set”에 설명된 대로 문자의 정렬 방법을 정의합니다.
non-Unicode multibyte character set을 위한 collation
이 유형의 collation에서는 8-bit (single-byte) 문자와 multibyte 문자를 다르게 처리합니다. 8-bit 문자에 대해서는, 문자 코드는 대소문자를 구분하지 않는 방식으로 weight에 매핑됩니다. (예를 들어, single-byte 문자 'a'와 'A'는 모두 0x41의 weight를 가집니다.) multibyte 문자에 대해서는 문자 코드와 weight 사이에 두 가지 유형의 관계가 있습니다:
sjis_japanese_ci가 이러한 종류의 collation의 예입니다. multibyte 문자 'ぢ'는 문자 코드가 0x82C0이고, weight 역시 0x82C0입니다.1mysql> CREATE TABLE t1 2 (c1 VARCHAR(2) CHARACTER SET sjis COLLATE sjis_japanese_ci); 3Query OK, 0 rows affected (0.01 sec) 4 5mysql> INSERT INTO t1 VALUES ('a'),('A'),(0x82C0); 6Query OK, 3 rows affected (0.00 sec) 7Records: 3 Duplicates: 0 Warnings: 0 8 9mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1; 10+------+---------+------------------------+ 11| c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) | 12+------+---------+------------------------+ 13| a | 61 | 41 | 14| A | 41 | 41 | 15| ぢ | 82C0 | 82C0 | 16+------+---------+------------------------+ 173 rows in set (0.00 sec)
gbk_chinese_ci가 이러한 종류의 collation의 예입니다. multibyte 문자 '膰'는 문자 코드가 0x81B0이지만, weight는 0xC286입니다.1mysql> CREATE TABLE t1 2 (c1 VARCHAR(2) CHARACTER SET gbk COLLATE gbk_chinese_ci); 3Query OK, 0 rows affected (0.33 sec) 4 5mysql> INSERT INTO t1 VALUES ('a'),('A'),(0x81B0); 6Query OK, 3 rows affected (0.00 sec) 7Records: 3 Duplicates: 0 Warnings: 0 8 9mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1; 10+------+---------+------------------------+ 11| c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) | 12+------+---------+------------------------+ 13| a | 61 | 41 | 14| A | 41 | 41 | 15| 膰 | 81B0 | C286 | 16+------+---------+------------------------+ 173 rows in set (0.00 sec)
구현 방법에 대한 지침은 Section 12.13, “Adding a Character Set”를 참조하십시오.
Unicode multibyte character set을 위한 collation
이들 collation 중 일부는 Unicode Collation Algorithm (UCA)을 기반으로 하고, 일부는 그렇지 않습니다.
non-UCA collation은 문자 코드에서 weight로의 일대일 매핑을 가집니다. MySQL에서 이러한 collation은 대소문자를 구분하지 않고, 액센트도 구분하지 않습니다.
utf8mb4_general_ci가 그 예입니다:
'a', 'A', 'À', 'á'는 각각 다른 문자 코드를 가지지만, 모두 weight가 0x0041이며 비교 시 동일하다고 간주됩니다.
1mysql> SET NAMES 'utf8mb4' COLLATE 'utf8mb4_general_ci'; 2Query OK, 0 rows affected (0.00 sec) 3 4mysql> CREATE TABLE t1 5 (c1 CHAR(1) CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci); 6Query OK, 0 rows affected (0.01 sec) 7 8mysql> INSERT INTO t1 VALUES ('a'),('A'),('À'),('á'); 9Query OK, 4 rows affected (0.00 sec) 10Records: 4 Duplicates: 0 Warnings: 0 11 12mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1; 13+------+---------+------------------------+ 14| c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) | 15+------+---------+------------------------+ 16| a | 61 | 0041 | 17| A | 41 | 0041 | 18| À | C380 | 0041 | 19| á | C3A1 | 0041 | 20+------+---------+------------------------+ 214 rows in set (0.00 sec)
MySQL의 UCA 기반 collation은 다음과 같은 특성을 가집니다:
어떤 문자에 weight가 있다면, 각 weight는 2바이트(16비트)를 사용합니다.
문자는 weight가 하나도 없을 수 있습니다(또는 빈 weight). 이 경우, 해당 문자는 무시할 수 있는 문자입니다. 예: "U+0000 NULL"은 weight가 없으며 무시 가능합니다.
문자는 하나의 weight를 가질 수 있습니다. 예: 'a'는 0x0E33이라는 weight를 가집니다.
1mysql> SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; 2Query OK, 0 rows affected (0.05 sec) 3 4mysql> SELECT HEX('a'), HEX(WEIGHT_STRING('a')); 5+----------+-------------------------+ 6| HEX('a') | HEX(WEIGHT_STRING('a')) | 7+----------+-------------------------+ 8| 61 | 0E33 | 9+----------+-------------------------+ 101 row in set (0.02 sec)
'ß' (SZ ligature 또는 SHARP S)는 0x0FEA0FEA라는 weight를 가집니다.1mysql> SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; 2Query OK, 0 rows affected (0.11 sec) 3 4mysql> SELECT HEX('ß'), HEX(WEIGHT_STRING('ß')); 5+-----------+--------------------------+ 6| HEX('ß') | HEX(WEIGHT_STRING('ß')) | 7+-----------+--------------------------+ 8| C39F | 0FEA0FEA | 9+-----------+--------------------------+ 101 row in set (0.00 sec)
'ch'는 체코어에서 하나의 문자이며 0x0EE2라는 weight를 가집니다.1mysql> SET NAMES 'utf8mb4' COLLATE 'utf8mb4_czech_ci'; 2Query OK, 0 rows affected (0.09 sec) 3 4mysql> SELECT HEX('ch'), HEX(WEIGHT_STRING('ch')); 5+-----------+--------------------------+ 6| HEX('ch') | HEX(WEIGHT_STRING('ch')) | 7+-----------+--------------------------+ 8| 6368 | 0EE2 | 9+-----------+--------------------------+ 101 row in set (0.00 sec)
다수의 문자에서 다수의 weight로 매핑하는 것도 가능합니다(이는 contraction과 expansion의 결합이지만), MySQL에서는 지원되지 않습니다.
구현 방법에 대한 지침은, non-UCA collation의 경우 Section 12.13, “Adding a Character Set”을, UCA collation의 경우 Section 12.14.4, “Adding a UCA Collation to a Unicode Character Set”를 참조하십시오.
기타(miscellaneous) collation
이전의 어느 범주에도 속하지 않는 몇 가지 collation도 존재합니다.
12.14 Adding a Collation to a Character Set
12.14.2 Choosing a Collation ID