10.4.1 데이터 정렬의 구현 유형
MySQL은 여러 유형의 데이터 정렬을 구현합니다.
8 비트 문자 세트에 대한 간단한 데이터 정렬
이러한 데이터 정렬은 문자 코드와 무게의 1 대 1 매핑을 정의한 256 개의 가중치의 배열을 사용하여 구현됩니다. latin1_swedish_ci
이 그 예입니다. 이것은 대소 문자를 구별하지 않는 데이터 정렬이므로 대문자와 소문자는 같은 무게에서 동일한 것으로 간주됩니다.
mysql>SET NAMES 'latin1' COLLATE 'latin1_swedish_ci';
Query OK, 0 rows affected (0.01 sec) mysql>SELECT HEX(WEIGHT_STRING('a')), HEX(WEIGHT_STRING('A'));
+-------------------------+-------------------------+ | HEX(WEIGHT_STRING('a')) | HEX(WEIGHT_STRING('A')) | +-------------------------+-------------------------+ | 41 | 41 | +-------------------------+-------------------------+ 1 row in set (0.01 sec) mysql>SELECT 'a' = 'A';
+-----------+ | 'a' = 'A' | +-----------+ | 1 | +-----------+ 1 row in set (0.12 sec)
구현 단계에 대해서는 섹션 10.4.3 "8 비트 문자 세트에 대한 간단한 데이터 정렬 추가" 를 참조하십시오.
8 비트 문자 세트에 대한 복잡한 데이터 정렬
이러한 데이터 정렬은 섹션 10.3 "문자 세트 추가" 에서 설명하고있는 바와 같이, 문자를 정렬하는 방법을 정의한 C 소스 파일의 함수를 사용하여 구현됩니다.
Unicode 이외의 멀티 바이트 문자 집합의 데이터 정렬
이러한 데이터 정렬은 8 비트 (싱글 바이트) 문자와 멀티 바이트 문자가 다르게 처리됩니다. 8 비트 문자의 경우 문자 코드는 대소 문자를 구별하지 않는 형식에서 가중치에 매핑됩니다. (예를 들어, 단일 바이트 문자 'a'
와 'A'
모두 무게가 0x41
입니다.) 멀티 바이트 문자의 경우 문자 코드와 무게 사이에는 두 가지 관계가 있습니다.
가중치가 코드와 동일한 경우.
sjis_japanese_ci
이 이런 종류의 데이터 정렬의 예입니다. 멀티 바이트 문자'ぢ'
의 문자 코드는0x82C0
이며, 무게도0x82C0
입니다.mysql>
CREATE TABLE t1
->(c1 VARCHAR(2) CHARACTER SET sjis COLLATE sjis_japanese_ci);
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO t1 VALUES ('a'),('A'),(0x82C0);
Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+ | c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) | +------+---------+------------------------+ | a | 61 | 41 | | A | 41 | 41 | | ぢ | 82C0 | 82C0 | +------+---------+------------------------+ 3 rows in set (0.00 sec)문자 코드가 1 대 1로 무게에 매핑되어 있어도 반드시 코드와 무게가 동일하지 않은 경우.
gbk_chinese_ci
이 이런 종류의 데이터 정렬의 예입니다. 멀티 바이트 문자'膰'
문자 코드는0x81B0
이지만 무게는0xC286
입니다.mysql>
CREATE TABLE t1
->(c1 VARCHAR(2) CHARACTER SET gbk COLLATE gbk_chinese_ci);
Query OK, 0 rows affected (0.33 sec) mysql>INSERT INTO t1 VALUES ('a'),('A'),(0x81B0);
Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+ | c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) | +------+---------+------------------------+ | a | 61 | 41 | | A | 41 | 41 | | 膰 | 81B0 | C286 | +------+---------+------------------------+ 3 rows in set (0.00 sec)
구현 지침은 섹션 10.3 "문자 세트 추가" 를 참조하십시오.
Unicode 멀티 바이트 문자 집합의 데이터 정렬
이러한 데이터 정렬의 일부는 Unicode 데이터 정렬 알고리즘 (UCA)에 근거 합니다만, 그 이외는 따라하지 않습니다.
UCA에 근거하지 않는 데이터 정렬은 문자 코드와 무게는 1 대 1로지도하고 있습니다. MySQL에서는 이러한 데이터 정렬은 대소 문자를 구별하지 않고, 악센트, 탁음, 대중 음악을 구분하지 않습니다. utf8_general_ci
이 그 예입니다. 'a'
, 'A'
, 'À'
및 'á'
의 각 문자 코드는 별도이며, 무게는 모든 0x0041
이며 동일한 것으로 간주됩니다.
mysql>SET NAMES 'utf8' COLLATE 'utf8_general_ci';
Query OK, 0 rows affected (0.00 sec) mysql>CREATE TABLE t1
->(c1 CHAR(1) CHARACTER SET UTF8 COLLATE utf8_general_ci);
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO t1 VALUES ('a'),('A'),('À'),('á');
Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql>SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+ | c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) | +------+---------+------------------------+ | a | 61 | 0041 | | A | 41 | 0041 | | À | C380 | 0041 | | á | C3A1 | 0041 | +------+---------+------------------------+ 4 rows in set (0.00 sec)
MySQL의 UCA 기반 데이터 정렬은 다음의 세 가지 특성이 있습니다.
문자에 무게가있는 경우 각각의 가중치는 2 바이트 (16 비트)를 사용합니다.
문자의 무게는 제로 (또는 빈 무게)의 경우가 있습니다. 이 경우, 문자는 무시할 수 있습니다. 예 : "U + 0000 NULL '은 무게가없고, 무시할 수 있습니다.
하나의 문자가 하나의 무게를 가질 수 있습니다. 예 :
'a'
는0x0E33
무게가 있습니다.mysql>
SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
Query OK, 0 rows affected (0.05 sec) mysql>SELECT HEX('a'), HEX(WEIGHT_STRING('a'));
+----------+-------------------------+ | HEX('a') | HEX(WEIGHT_STRING('a')) | +----------+-------------------------+ | 61 | 0E33 | +----------+-------------------------+ 1 row in set (0.02 sec)하나의 문자가 여러 가중치를 가지는 경우가 있습니다. 이것은 확장 형식입니다. 예 : 독일어 문자
'ß'
(SZ 리가 챠이나 SHARP S)는0x0FEA0FEA
무게가 있습니다.mysql>
SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
Query OK, 0 rows affected (0.11 sec) mysql>SELECT HEX('ß'), HEX(WEIGHT_STRING('ß'));
+-----------+--------------------------+ | HEX('ß') | HEX(WEIGHT_STRING('ß')) | +-----------+--------------------------+ | C39F | 0FEA0FEA | +-----------+--------------------------+ 1 row in set (0.00 sec)여러 문자가 하나의 무게를 가질 수 있습니다. 이것은 단축 형식입니다. 예 :
'ch'
은 체코 어의 단일 문자이며,0x0EE2
의 무게를 가지고 있습니다.mysql>
SET NAMES 'utf8' COLLATE 'utf8_czech_ci';
Query OK, 0 rows affected (0.09 sec) mysql>SELECT HEX('ch'), HEX(WEIGHT_STRING('ch'));
+-----------+--------------------------+ | HEX('ch') | HEX(WEIGHT_STRING('ch')) | +-----------+--------------------------+ | 6368 | 0EE2 | +-----------+--------------------------+ 1 row in set (0.00 sec)
여러 문자와 여러 가중치 매핑시킬 수도있다 (이것은 확장 형식을 사용한 단축 형식입니다)이 MySQL에서 지원되지 않습니다.
UCA에 근거하지 않는 데이터 정렬에 대한 구현의 자세한 내용은 섹션 10.3 "문자 세트 추가" 를 참조하십시오. UCA 데이터 정렬은 섹션 10.4.4 "Unicode 문자 세트에 UCA 데이터 정렬의 추가" 를 참조하십시오.
기타 데이터 정렬
위 범주의 어느 것에도 해당하지 않는 데이터 정렬도 소수 존재합니다.