10.9.5 Набор символов 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. Примеры приведены в разделе 15.5 Зона замещающих символов документа Unicode 4.0.
Поскольку utf16 поддерживает замещающие символы, а ucs2 нет, существует проверка корректности, которая применяется только в utf16: Вы не можете вставить верхний замещающий символ без нижнего замещающего символа, и наоборот. Например:
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 должен учитывать худший случай (когда один символ требует четырёх байтов), максимальная длина столбца или индекса utf16 составляет только половину максимальной длины столбца или индекса ucs2. Например, максимальная длина ключа индекса таблицы 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);
© 2025 Oracle
Licensed under the GPLv2 License.