Spec-Zone .ru
спецификации, руководства, описания, API
|
utf16
набор символов ucs2
набор символов с расширением,
которое позволяет кодировать дополнительных символов:
Для символа BMP, utf16
и ucs2
имейте идентичные характеристики хранения: те же самые кодовые
обозначения, то же самое кодирование, та же самая длина.
Для дополнительного символа, utf16
имеет специальную
последовательность для того, чтобы представить символ, используя 32 бита. Это вызывают "суррогатным" механизмом: Для числа,
больше чем 0xffff
, возьмите 10 битов и добавьте их к 0xd800
и помещенный их в первое 16-разрядное слово, возьмите еще 10 битов и добавьте их к 0xdc00
и помещенный их в следующее 16-разрядное слово. Следовательно, все
дополнительные символы требуют 32 битов, где первые 16 битов являются числом между 0xd800
и 0xdbff
, и последние 16 битов
являются числом между 0xdc00
и 0xdfff
. Примеры
находятся в Разделе
Поскольку 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);