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