我知道以前也曾问过类似的问题,但我们需要一个更明确的答案。
在所有情况下,将以utf8
编码的MySQL表更新为utf8mb4
是否安全?更具体地说,即使对于使用例如在Java中生成的字符串的varchar
字段,也是如此:
new BigInteger(130, random).toString(32)
根据我们的理解,utf8mb4
是utf8
的超集,因此我们的假设是一切都应该很好,但是我们希望更多的MySQL超级用户提供一些输入。
答案 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
当然我想您将使用相同的排序规则。如果您更改排序规则,则其他问题将适用。