Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  The utf16 Character Set (UTF-16 Unicode Encoding)

12.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 之间的数字。示例见 Unicode 4.0 文档的15.5 代理区

因为 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 Logo,这是合法的:

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