utf8和latin1之间的区别


Answers:


151

UTF-8为世界统治做好了准备,而Latin1则没有。

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

注意,完整的4字节UTF-8支持仅在MySQL 5.5中引入。在该版本之前,每个字符最多增加3个字节,每个字符最多增加4个字节。因此,它仅支持BMP平面,而不支持Emoji平面。如果要完全支持4字节UTF-8,请将MySQL至少升级到5.5或使用其他RDBMS(如PostgreSQL)。在MySQL 5.5+中,它称为utf8mb4


31
Mysql 5.1支持3字节UTF-8,但是Mysql 5.5 确实支持 4字节UTF-8作为utf8mb4。
velcrow

2
@BalusC您能否详细说明如何不完全支持UTF-8?这是否意味着Mysql 5.1无法存储所有 unicode字符?
Pacerier 2012年

2
@Pacerier:每个字符仅支持3个字节,因此仅支持BMP(前65535个字符),而不支持剩余字符。对于所有的字符,请参阅en.wikipedia.org/wiki/Plane_(Unicode)
BalusC

2
@BalusC对于使用5.1.63并且没有权限更新Web服务器的mysql版本的用户,可能有什么替代方法?
Pacerier 2012年

6
@Pacerier:您可以自己另存为VARBINARYVARCHAR然后在业务层中进行解码/编码,但这是很棘手的。考虑问一个新问题,也许有更好的方法。
BalusC 2012年

47

在latin1中,每个字符正好是一个字节长。在utf8中,一个字符可以包含多个字节。因此,utf8的字符数比latin1的字符数多(并且它们的共同字符不一定用相同的字节/字节序列表示)。


1
那ascii和bin呢?
Yousha Aleayoub '17

8
@YoushaAleayoub ASCII是一种单字节编码,使用0到127之间的字符,因此它可以编码的字符数是latin1的一半。它是latin1和utf8的严格子集,这意味着latin1和utf8中的0到127字节编码与ASCII相同。Bin不是编码。通常,您可以在读取文件时提供此选项,告诉IO函数不应用任何编码,而只是逐字节读取文件。
sepp2k

1
谢谢,我的意思是binary整理...?以及哪个适合英语/数字领域:ascii_general_ciascii_bin
Yousha Aleayoub '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.