在 MySQL 中将表从 utf8 更新为 utf8mb4 是否安全?

Is it safe to update tables from utf8 to utf8mb4 in MySQL?

我知道之前有人问过类似的问题,但我们需要一个更明确的答案。

在所有情况下,将 utf8 中编码的 MySQL 表更新为 utf8mb4 是否安全?更具体地说,即使对于 varchar 字段,使用例如 (in Java):

生成的字符串
new BigInteger(130, random).toString(32)

根据我们的理解,utf8mb4utf8 的超集,因此我们的假设是一切都应该没问题,但我们希望更多 MySQL 超级用户提供一些意见。

数据最初是如何插入到 MySQL 中的是无关紧要的。假设您使用了 utf8 的整个字符集,例如BMP 字符。

utf8mb4 是 utf8mb3(别名 utf8)的超集 here

10.9.7 Converting Between 3-Byte and 4-Byte Unicode Character Sets

从 utf8mb3 转换为 utf8mb4 的一个优点是,这使应用程序能够使用增补字符。一个权衡是这可能会增加数据存储 space 要求。

就table内容而言,从utf8mb3转换为utf8mb4没有问题:

  • 对于BMP字符,utf8mb4和utf8mb3有相同的存储空间 特点:相同的码值,相同的编码,相同的长度。

  • 一个增补字符,utf8mb4需要四个字节来存储 它,而 utf8mb3 根本不能存储字符。什么时候 将 utf8mb3 列转换为 utf8mb4,你不必担心 转换补充字符,因为会有 none.

就 table 结构而言,这些是主要的潜在不兼容性:

  • 对于可变长度字符数据类型(VARCHAR 和 TEXT 类型),utf8mb4 列的最大允许字符长度小于 utf8mb3 列。

  • 对于所有字符数据类型(CHAR、VARCHAR 和 TEXT 类型),utf8mb4 列可以索引的最大字符数少于 utf8mb3 列。

因此,要将 tables 从 utf8mb3 转换为 utf8mb4,可能需要更改某些列或索引定义。

就我个人而言,我对已达到索引最大大小的相对较长文本的索引存在一些问题。这是一个搜索索引,而不是唯一索引,因此解决方法是在索引中使用较少的字符。另见

当然,我想您会使用相同的排序规则。如果您更改排序规则,则其他问题适用。