我知道以前曾有人问过类似的问题,但我们需要更明确的答案。
在所有情况下将 utf8
编码的 MySQL 表更新为 utf8mb4
是否安全?更具体地说,即使对于使用例如(在 Java 中)生成的字符串的 varchar
字段:
new BigInteger(130, random).toString(32)
根据我们的理解,utf8mb4
是 utf8
的超集,因此我们的假设是一切都应该没问题,但我们希望更多 MySQL super 用户提供一些输入。
最佳答案
数据最初如何插入 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
当然,我想您会使用相同的排序规则。如果您更改排序规则,则会出现其他问题。
关于mysql - 在 MySQL 中将表从 utf8 更新为 utf8mb4 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59836921/