Spec-Zone .ru
спецификации, руководства, описания, API

10.1.10.2. utf16 Набор символов (Кодирование Unicode UTF-16)

utf16 набор символов ucs2 набор символов с расширением, которое позволяет кодировать дополнительных символов:

Поскольку 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 должен учесть худший случай (что один символ требует четырех байтов), максимальная длина a utf16 столбец или индексирует, только половина максимальной длины для a ucs2 столбец или индексирует. Например, в MySQL 5.7, максимальной длине a 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);