似乎对大多数字段使用ASCII字符集,然后仅对需要的字段指定utf8,这将使数据库必须执行的I / O数量减少100%。
有人知道这是真的吗?
更新:以上并不是我的问题。我应该说:使用拉丁语作为默认字符集,然后仅对需要它的字段指定utf8mb4。这种想法是:使用1字节vs 2字节应将I / O提高100%。抱歉造成混乱。
答案 0 :(得分:6)
简短答案:不值得担心。
长答案:
两个问题:
将两种编码与相应的_bin(ascii_bin或utf8_bin)COLLATION
进行比较,就像比较字节一样简单,因此没有显着差异。其他排序规则可能有所不同,其中ascii更快。 但是与获取行等的努力相比,差别不大。
Ascii是utf8的子集。 utf8像每个ascii一样,每个ascii字符只存储1个字节。因此,没有空间差异。 (西欧的重音字母需要1字节的latin1或2字节的utf8;因此不兼容且大小不同。)空间导致缓存,从而导致性能略有差异。
对于英文文本,可节省0%。对于欧洲人来说,latin1仅能节省百分之几;对于世界上大多数其他地区,utf8是唯一可行的解决方案。对于中文和表情符号,utf8mb4是必须的。
在某些情况下,字符串消耗的空间会扩展到最大可能值。 country_code CHAR(2) CHARACTER SET ...
将占用2个字节的ascii; utf8为6个字节。
底线:
将ascii用于国家/地区代码,十六进制,邮政编码,uuid,md5s等。如果要国际化和/或需要表情符号,请制作“字符串” utf8mb4。这样做是因为它是“正确的”,而不是因为您会神奇地获得更快的速度。你不会的。并在创建表时执行;是以后更改它的陷阱。
答案 1 :(得分:3)
@RickJames是正确的,您不必担心通过在utf8mb4上选择ASCII或utf8来节省空间。
utf8和utf8mb4是可变长度字符编码。 wikipedia中的此表说明了字符如何自动占用1、2、3或4个字节,具体取决于编码的值。如果设置了字节的高位,则字符将使用一个额外的字节,最多4个字节。
前128个字符(US-ASCII)需要一个字节。接下来的1,920个字符需要两个字节进行编码,涵盖几乎所有拉丁字母字母表的其余部分,以及希腊语,西里尔字母,科普特语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语,Thaana和N'Ko字母,以及组合变音符号分数。在基本多语言平面的其余部分中,字符需要三个字节,其中几乎包含了所有常用的字符,包括大多数中文,日文和韩文字符。 Unicode其他平面中的字符需要四个字节,其中包括不太常见的CJK字符,各种历史脚本,数学符号和表情符号(象形符号)。
您无需执行任何操作即可选择单字节模式还是多字节模式。这就是编码的工作方式。每个字符都会自动使用所需的字节数,而不会更多。
因此,除非您需要限制字符串中允许的字符,否则使用utf8而不是utf8mb4并没有使用ASCII的优势。
就其价值而言,MySQL称为“ utf8”的字符集是utf8mb3的别名,它只是UTF8编码的前三个字节的实现。 MySQL服务器团队博客(https://mysqlserverteam.com/mysql-8-0-when-to-use-utf8mb3-over-utf8mb4/)表示,至少考虑到MySQL 8.0中的性能改进,utf8mb4更快,并且utf8mb3应该被弃用。 MySQL 8.0.11 release notes说,在将来的某些MySQL版本中,utf8将被重新定义为utf8mb4的别名。