12.9.5 Набор символов utf16 (кодировка Unicode UTF-16)
Набор символов 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.