Bal*_*usC 145

UTF-8是为世界统治而准备的,Latin1不是.

如果你试图使用Latin1编码存储非拉丁字符,如中文,日文,希伯来文,俄文等,那么它们最终将成为mojibake.您可能会发现的介绍性文字这篇文章很有用(甚至更多,如果你知道一点的Java).

请注意,仅在MySQL 5.5中引入了完整的4字节UTF-8支持.在该版本之前,每个字符最多只能有3个字节,而不是每个字符4个字节.因此,它仅支持BMP平面,而不支持例如表情符号平面.如果你想要完整的4字节UTF-8支持,请将MySQL升级到至少5.5或者去另一个像PostgreSQL这样的RDBMS.在MySQL 5.5+中它被称为utf8mb4.

  • Mysql 5.1支持3字节UTF-8,但Mysql 5.5 [支持](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html)4字节UTF-8为utf8mb4. (30认同)
  • @Pacerier:你可以自己保存为`VARBINARY`而不是`VARCHAR`并在业务层中解码/编码,但这很麻烦.考虑问一个新问题,也许有更好的方法. (6认同)
  • @BalusC你能详细说明UTF-8是如何得不到完全支持的吗?这是否意味着Mysql 5.1无法存储*all*unicode字符? (2认同)
  • @Pacerier:它只支持每个字符3个字节,因此只支持BMP(前65535个字符),残余不支持.对于所有角色,请参阅http://en.wikipedia.org/wiki/Plane_(Unicode) (2认同)
  • @BalusC对于使用5.1.63并且没有权限更新Web服务器的mysql版本的人,可能有哪些替代方案? (2认同)

sep*_*p2k 41

在latin1中,每个字符恰好是一个字节长.在utf8中,一个字符可以包含多个字节.因此,utf8具有比latin1更多的字符(并且它们共同具有的字符不一定由相同的字节/字节序列表示).

  • @YoushaAleayoub ASCII是一个单字节编码,使用字符0到127,因此它可以编码一半的字符,如latin1.它是latin1和utf8的严格子集,意味着latin1和utf8中的字节0到127编码与ASCII中的相同.Bin不是编码.它通常是一个选项,您可以在读取文件时给出,告诉IO函数不应用任何编码,而只是逐字节读取文件. (7认同)