mysql - 在 MySQL 中将表从 utf8 更新为 utf8mb4 安全吗?

标签 mysql utf-8 utf8mb4

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

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

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

根据我们的理解,utf8mb4utf8 的超集,因此我们的假设是一切都应该没问题,但我们希望更多 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/

相关文章:

redmine - MYSQL优化一个137000行的表

php - 来自命令行的瑞典字符的utf8问题

C#:循环编码

python - ElementTree不以UTF-8写入数据

php - Mysql UNIQUE KEY 约束 - a 和 å 被视为相同的字符

python - 当我使用latin-1编码将utf8编码字符从pandas发送到mysql时,编码字符错误

php - 使用包含连接时如何从 MySql 数据库中获取?

mysql - 如何使用 Auth0 的自定义数据库将用户添加到 MySQL 数据库?

MySQL 为单个表情符号返回多个结果

mysql - Migrating MySQL UTF8 to UTF8MB4问题与疑问