UTF8和Latin1之间的区别

169

UTF8和Latin1之间有什么区别?


5
它们是不同的编码方式(将某些字符映射到常见的字节序列中,例如ASCII字符和许多带重音的字母)。 UTF-8是Unicode的一种编码方式,包含其所有代码点;Latin1只编码少于256个字符。 - ShreevatsaR
还有Latin9可用于Linux语言环境,可能在问题中已经提到:https://en.wikipedia.org/wiki/ISO/IEC_8859-15 - baptx
这回答了你的问题吗?UTF-8和ISO-8859-1有什么区别? - Karl Knechtel
2个回答

185

UTF-8被准备用于世界占领,Latin1没有这样的功能。

如果您试图使用Latin1编码存储像中文、日语、希伯来语和俄语等非拉丁字符,则它们最终将成为乱码。您可能会发现本文介绍的简介有用(如果您了解一些Java,则更是如此)。

请注意,在MySQL 5.5中才引入了完整的4字节UTF-8支持。在此之前的版本,每个字符只支持3个字节而不是4个字节。因此,它仅支持BMP平面,而不支持Emoji平面等。如果您需要完整的4字节UTF-8支持,请将MySQL升级至至少5.5版本或选择另一个RDBMS,例如PostgreSQL。在MySQL 5.5+中,它称为utf8mb4


33
Mysql 5.1支持3字节的UTF-8编码,但是Mysql 5.5 支持 4字节的UTF-8编码,称为utf8mb4。 - velcrow
2
@BalusC,您能详细说明UTF-8的不完全支持吗?这是否意味着Mysql 5.1无法存储所有Unicode字符? - Pacerier
2
@Pacerier:它只支持每个字符3个字节,因此只支持BMP(前65535个字符),不支持剩余部分。有关所有字符,请参见http://en.wikipedia.org/wiki/Plane_(Unicode)。 - BalusC
2
@BalusC 对于那些使用5.1.63版本并且没有特权更新Web服务器的MySQL版本的人来说,可能有什么替代方案? - Pacerier
6
你可以将数据保存为 VARBINARY 而不是 VARCHAR,然后在业务层自己进行解码/编码,但这样做有些取巧。建议你提出新的问题,也许会有更好的方法。 - BalusC
显示剩余7条评论

63

在latin1编码中,每个字符都恰好占用一个字节的长度。而在UTF-8编码中,一个字符可以由多个字节组成。因此,UTF-8拥有比latin1更多的字符(且它们所共同拥有的字符不一定由相同的字节/字节序列表示)。


1
ASCII和二进制怎么样? - Yousha Aleayoub
10
ASCII是一种单字节编码,使用字符0到127,因此可以编码的字符数只有Latin1的一半。它严格是Latin1和UTF8的子集,这意味着在Latin1和UTF8中,字节0到127编码的内容与ASCII相同。"Bin"不是一种编码方式,通常用作读取文件时的选项,告诉IO函数不要应用任何编码,而是逐字节读取文件。 - sepp2k
1
谢谢,我是指binary排序规则...?对于英文/数字字段,哪个更好:ascii_general_ci还是ascii_bin - Yousha Aleayoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接