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
支持代理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 iON tf (s1);CREATE TABLE tg (s1 VARCHAR(768)CHARACTER SET utf16)ENGINE =MEMORY ;CREATE INDEX iON tg (s1);