迁移到utf8mb4utf8mb4字符集是MySQL的新的默认为8.0,和这种变化影响到现有数据和部队任何升级。

迁移到utf8mb4有许多优点,包括:

  • 它可以储存更多的符号,包括emojis
  • 新的排序对亚洲语言
  • 它是utf8mb3

尽管如此,你可能想知道移民如何影响你的现有数据。这个博客涵盖多个方面。

存储需求

顾名思义,一个字符可以采取的最大字节数与字符集utf8mb4是四个字节。这是比的要求utf8mb3这需要三个字节和许多其他MySQL字符集。

幸运的是,utf8mb3是的一个子集utf8mb4,和迁移现有的数据并不会增加数据存储在磁盘的大小:每个字符占用多少字节。例如,拉丁字母数字或字母需要一个字节。从其他字母字符可以占用4个字节。这可以用一个简单的测试验证。

因此,所有数据使用最多三个字节不会改变,你将能够存储需要4个字节的字符编码。

最大长度的列

而不改变数据存储,当MySQL计算最大列可以存储的数据量,它可能会失败对于一些列大小定义,正常工作utf8mb3。例如,您可以有一个与这个定义表:

如果你决定把这个表使用utf8mb4字符集,操作将会失败:

这样做的原因是,的最大字节数,MySQL可以存储在一个VARCHAR列是65535,这是21845个字符utf8mb3字符集和16383个字符utf8mb4字符集。

因此,如果你有列可能包含超过16383个字符,您将需要将其转换成的文本量变数据类型。

你可以找到所有这些列如果运行查询:

例如,在我的测试环境,它返回:

索引存储要求

MySQL事先并不知道哪些字符存储在列创建索引时。因此,当它计算所需的存储索引,需要选择的字符集的最大值。作为一个结果,你可能会影响索引存储限制从另一个字符集转换的时候出现utf8mb4。InnoDB,索引的最大大小是767字节冗余紧凑的行格式,3072字节动态压缩行格式。看到用户参考手册获取详细信息。

这意味着你需要检查如果你有索引,可以长到超过这些值在执行更新。你可以用下面的查询:

下面是我的测试环境中运行查询的结果:

一旦你已经确定了这样的索引,检查列和调整相应的表定义。

注意:查询使用CTEMySQL 8.0的,可用。如果你仍在5.7或更早版本,您将需要重写查询。

临时表

一个问题你可以转换后utf8mb4字符集是一个隐含的临时表的大小增加,MySQL创建解决查询。自utf8mb4可能比其他字符集存储更多的数据,这种隐式表的列的大小也将更大。找出如果你受到这个问题的影响,看全局状态变量Created_tmp_disk_tables。如果这开始显著增加在迁移之后,您可能会考虑更新RAM在您的机器上,增加临时表的最大大小。注意,这个问题可能是一个症状,你的一些查询优化。

结论

转换到utf8mb4字符集带给你的优势更好的性能,更大范围的字符,您可以使用,包括emojis和新排序(排序规则)。这种转换发生在几乎没有价格,可以顺利完成。

确保:

  • 你转换VARCHAR列存储超过16383个字符文本量变数据类型
  • 你调整索引定义可能需要超过767字节冗余紧凑的行格式,3072字节动态压缩行格式后迁移。
  • 优化你的查询,以便他们不应该开始使用内部基于磁盘的临时表

订阅
通知的
客人

5评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论

值得一提的另一个问题:从use utf8 (mb3)迁移到utf8mb4可能打破独特的约束自排序是不相同的。看到https://dev.mysql.com/blog-archive/mysql-8-0-collations-migrating-from-older-collations/https://dev.mysql.com/blog-archive/mysql-8-0-collations-migrating-from-older-collations-part-2/

dimus

>这是比utf8mb3快
性能utf8mb3 vs utf8mb4 MariaDB呢?

马克Gruenberg

这是一个错误的查询:

从information_schema。在NODB_INDEXES i JOIN information_schema.INNODB_TABLES t USING(TABLE_ID)

它应该是
从information_schema。在NODB_SYS_INDEXES i JOIN information_schema.INNODB_SYS_TABLES t USING(TABLE_ID)