10.1.10.2 utf16 문자 세트 (UTF-16 Unicode 인코딩)
utf16
문자 세트는 보조 문자 인코딩을 가능하게하는 확장 기능을 갖춘 ucs2
문자 집합입니다.
BMP 문자의 경우
utf16
과ucs2
동일한 코드 값 같은 인코딩 같은 길이라는 동일한 스토리지 특성이 있습니다.보조 문자의 경우
utf16
에는 32 비트를 사용하는 문자를 나타 내기위한 특수 시퀀스가 있습니다. 이것은 "대리"메커니즘이라고합니다.0xffff
보다 큰 수치의 경우 10 비트를 확보하고 이들을0xd800
에 추가하고 첫 16 비트로 배치합니다. 또한 10 비트를 확보하고 이들을0xdc00
에 추가하고 다음 16 비트로 배치합니다. 따라서 모든 보조 문자 32 비트가 필요합니다. 이 중 첫 번째 16 비트는0xd800
과0xdbff
사이의 숫자이며, 나머지 16 비트는0xdc00
과0xdfff
사이의 숫자입니다. Unicode 4.0 문서의 " 15.5 Surrogates Area "에 예제가 포함되어 있습니다.
utf16
대리모를 지원하고 ucs2
을 지원하지 않기 때문에, utf16
에서만 적용되는 유효성 검사가 있습니다. 하위 surrogate가 없으면 상위 surrogate를 삽입 할 수없고 반대도 마찬가지입니다. 예 :
INSERT INTO t (ucs2_column) VALUES (0xd800); / * legal * / INSERT INTO t (utf16_column) VALUES (0xd800); / * illegal * /
기술적으로 유효하지만 진정한 Unicode가 아닌 문자 (즉, Unicode가 "할당되지 않은 코드 포인트"또는 "개인 사용"문자, 심지어 0xffff
처럼 "불법"으로 간주 문자)에 대한 타당성 확인은 없습니다 . 예를 들어, U+F8FF
는 Apple의 로고이므로이 유효합니다.
INSERT INTO t (utf16_column) VALUES (0xf8ff); / * legal * /
이러한 문자는 모든 사용자에게 동일한 의미를 갖게 기대할 수 없습니다.
MySQL은 최악의 경우 (문자가 4 바이트를 필요로하는 경우)에 대응할 필요가 있기 때문에, utf16
열 또는 인덱스의 최대 길이는 ucs2
열 또는 인덱스의 최대 길이의 절반 밖에 없습니다. 예를 들어, MySQL 5.6에서는 MEMORY
테이블 인덱스 키의 최대 길이는 3072 바이트이므로, 이러한 진술은 ucs2
및 utf16
컬럼에 대해 허용되는 최대 길이의 인덱스를 가진 테이블을 만듭니다.
CREATE TABLE tf (s1 VARCHAR (1536) CHARACTER SET ucs2) ENGINE = MEMORY; CREATE INDEX i ON tf (s1); CREATE TABLE tg (s1 VARCHAR (768) CHARACTER SET utf16) ENGINE = MEMORY; CREATE INDEX i ON tg (s1);