首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >utf-8与latin1

utf-8与latin1
EN

Stack Overflow用户
提问于 2012-09-17 02:07:03
回答 4查看 24.1K关注 0票数 19

与使用latin1相比,使用utf8作为字符集有什么优点/缺点?

如果utf可以支持更多的字符,并且经常使用,那么它不是更好的选择吗?有选择latin1的理由吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-17 02:14:42

latin1的优点是它是单字节编码,因此它可以在相同的存储空间中存储更多字符,因为MySql中字符串数据类型的长度取决于编码。手动states

若要计算用于存储特定CHAR、VARCHAR或TEXT列值的字节数,必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,在使用utf8 Unicode字符集时,必须记住并非所有字符都使用相同的字节数。utf8mb3和utf8mb4字符集可以分别要求每个字符最多三个和四个字节。有关用于不同类别的utf8mb3或utf8mb4字符的存储的详细信息,请参阅第10.9节,“Unicode支持”。

此外,使用单字节编码时,许多字符串操作(如获取子串和依赖于排序规则的比较)的速度更快。

在任何情况下,如果您关心国际化,latin1都不是一个重要的竞争者。当您要存储已知的安全值(如百分比编码的URL)时,它可能是一个合适的选择。

票数 19
EN

Stack Overflow用户

发布于 2012-09-17 02:24:24

UTF8的优势:

  1. 支持大多数语言,包括RTL语言,如希伯来语。
  2. 将数据导入/导出到支持UTF8的组件(JavaScript、Java等)时不需要翻译。

UTF8的缺点:

由于scheme.

  • Non-ASCII字符的编码更复杂,因此
  1. 非ASCII字符的编码和解码将花费更多时间,因为它们可能使用超过1个字节进行存储(字符不在ASCII字符集的前127个字符中)。一个CHAR(10)VARCHAR(10)字段可能需要多达30个字节来存储一些非UTF8字段(除了utf8_bin将会比较慢,因为排序顺序不会直接映射到字符编码顺序),并将需要在一些存储过程中的翻译(由于变量默认到utf8_general_ci JOIN你需要JOIN UTF8和非utf8字段,MySQL将造成严重的性能影响。如果连接的字段是不同的字符sets/collations.

,那么亚秒级查询可能需要几分钟的时间

底线:

如果您不需要支持非Latin1语言,希望实现最高性能,或者已经有使用latin1的表,请选择latin1

否则,选择UTF8

票数 20
EN

Stack Overflow用户

发布于 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_general_ci:(20)
  • latin1 latin1_bin: varchar 17ms
  • utf8_bin: varchar 23ms

对于像数字日期这样的简单字符串,当考虑到性能时,我的决定是使用utf8_bin (CHARACTER SET utf8 COLLATE utf8_bin)。这将防止对期望数据库字符集为utf8而仍然是二进制的其他代码产生任何不利影响。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12449336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档