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

时间:2019-02-22 08:08:18

标签: mysql utf-8 utf8mb4

我知道以前也曾问过类似的问题,但我们需要一个更明确的答案。

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

new BigInteger(130, random).toString(32)

根据我们的理解,utf8mb4utf8的超集,因此我们的假设是一切都应该很好,但是我们希望更多的MySQL超级用户提供一些输入。

1 个答案:

答案 0 :(得分:5)

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

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

所述
  

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

从utf8mb3转换为utf8mb4的一个优点是,这使应用程序可以使用补充字符。一种折衷是这可能会增加数据存储空间需求。

就表内容而言,从utf8mb3到utf8mb4的转换没有问题:

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

  • 对于补充字符,utf8mb4需要四个字节来存储 它,而utf8mb3根本无法存储字符。什么时候 将utf8mb3列转换为utf8mb4,您无需担心 转换辅助字符,因为将没有辅助字符。

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

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

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

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

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

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