Spec-Zone.ru › MySQL 9.2

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/charset-unicode-utf16.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API