• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • utf16字符集(UTF-16 Unicode编码)

    utf16字符集是ucs2字符集与使得能够编码的附加字符的扩展名:

    • 对于BMP字符,utf16ucs2具有相同的存储特性:相同的代码值,相同的编码,相同的长度。
    • 对于补充字符,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个字节,因此这些语句创建的表中具有允许的最长索引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);