Documentation Home
MySQL 8.0 参考手册  / 第 10 章字符集、排序规则、Unicode  / 10.9 Unicode 支持  /  10.9.5 utf16字符集(UTF-16 Unicode编码)

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支持代理 ,所以存在仅适用于以下情况的有效性检查:您不能在没有底部代理的情况下插入顶部代理,反之亦然。例如: ucs2utf16

INSERT INTO t (ucs2_column) VALUES (0xd800); /* legal */
INSERT INTO t (utf16_column)VALUES (0xd800); /* illegal */

对于技术上有效但不是真正 Unicode 的字符(即 Unicode 认为是未分配代码点私人使用字符甚至 非法”之类的字符),不进行有效性检查0xffff。例如,因为U+F8FF是 Apple Logo,所以这是合法的:

INSERT INTO t (utf16_column)VALUES (0xf8ff); /* legal */

不能指望这样的角色对每个人都意味着同样的事情。

因为 MySQL 必须考虑到最坏的情况(一个字符需要四个字节),所以 utf16列或索引的最大长度仅为列或索引的最大长度的一半ucs2。例如,MEMORY 表索引键的最大长度为 3072 字节,因此这些语句创建具有最长允许索引的表ucs2utf16列:

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);