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