与使用latin1相比,使用utf8作为字符集有什么优点/缺点?
如果utf可以支持更多的字符,并且经常使用,那么它不是更好的选择吗?有选择latin1的理由吗?
发布于 2012-09-17 02:14:42
latin1的优点是它是单字节编码,因此它可以在相同的存储空间中存储更多字符,因为MySql中字符串数据类型的长度取决于编码。手动states
若要计算用于存储特定CHAR、VARCHAR或TEXT列值的字节数,必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,在使用utf8 Unicode字符集时,必须记住并非所有字符都使用相同的字节数。utf8mb3和utf8mb4字符集可以分别要求每个字符最多三个和四个字节。有关用于不同类别的utf8mb3或utf8mb4字符的存储的详细信息,请参阅第10.9节,“Unicode支持”。
此外,使用单字节编码时,许多字符串操作(如获取子串和依赖于排序规则的比较)的速度更快。
在任何情况下,如果您关心国际化,latin1都不是一个重要的竞争者。当您要存储已知的安全值(如百分比编码的URL)时,它可能是一个合适的选择。
发布于 2012-09-17 02:24:24
UTF8的优势:
UTF8的缺点:
由于scheme.
CHAR(10)或VARCHAR(10)字段可能需要多达30个字节来存储一些非UTF8字段(除了utf8_bin将会比较慢,因为排序顺序不会直接映射到字符编码顺序),并将需要在一些存储过程中的翻译(由于变量默认到utf8_general_ci JOIN你需要JOIN UTF8和非utf8字段,MySQL将造成严重的性能影响。如果连接的字段是不同的字符sets/collations.,那么亚秒级查询可能需要几分钟的时间
底线:
如果您不需要支持非Latin1语言,希望实现最高性能,或者已经有使用latin1的表,请选择latin1。
否则,选择UTF8。
发布于 2014-07-22 23:20:07
@Ross Smith II,点4值黄金,这意味着列之间的不一致可能是危险的。
为了给已经很好的答案增加价值,这里有一个关于字符集之间差异的小性能测试:
一个现代的2013年服务器,实际使用的表有20000行,没有相关列的索引。
选择4 FROM subscribers WHERE 1 ORDER BY time_utc_str;(4表示缓存缓冲器)
字符集20ms
对于像数字日期这样的简单字符串,当考虑到性能时,我的决定是使用utf8_bin (CHARACTER SET utf8 COLLATE utf8_bin)。这将防止对期望数据库字符集为utf8而仍然是二进制的其他代码产生任何不利影响。
https://stackoverflow.com/questions/12449336
复制相似问题