在 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)
根据我们的理解,utf8mb4
是 utf8
的超集,因此我们的假设是一切都应该没问题,但我们希望更多 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,可能需要更改某些列或索引定义。
就我个人而言,我对已达到索引最大大小的相对较长文本的索引存在一些问题。这是一个搜索索引,而不是唯一索引,因此解决方法是在索引中使用较少的字符。另见
当然,我想您会使用相同的排序规则。如果您更改排序规则,则其他问题适用。
我知道之前有人问过类似的问题,但我们需要一个更明确的答案。
在所有情况下,将 utf8
中编码的 MySQL 表更新为 utf8mb4
是否安全?更具体地说,即使对于 varchar
字段,使用例如 (in Java):
new BigInteger(130, random).toString(32)
根据我们的理解,utf8mb4
是 utf8
的超集,因此我们的假设是一切都应该没问题,但我们希望更多 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,可能需要更改某些列或索引定义。
就我个人而言,我对已达到索引最大大小的相对较长文本的索引存在一些问题。这是一个搜索索引,而不是唯一索引,因此解决方法是在索引中使用较少的字符。另见
当然,我想您会使用相同的排序规则。如果您更改排序规则,则其他问题适用。