Nic*_*men 2 mysql utf-8 utf8mb4
我知道之前已经提出了类似的问题,但我们需要一个更明确的答案.
它是安全更新编码MySQL表utf8,以utf8mb4 在所有情况下.更具体地说,即使对于varchar使用例如(在Java中)生成的字符串的字段:
new BigInteger(130, random).toString(32)
Run Code Online (Sandbox Code Playgroud)
从我们的理解utf8mb4是一个超集,utf8所以我们的假设是一切都应该没问题,但我们会喜欢来自更多MySQL超级用户的一些输入.
数据最初如何插入MySQL是无关紧要的.假设您使用了utf8的整个字符集,例如BMP字符.
utf8mb4是utf8mb3(别名utf8)的超集,如此处所述
从utf8mb3转换为utf8mb4的一个优点是,这使应用程序可以使用补充字符.一个权衡是,这可能会增加数据存储空间要求.
就表格内容而言,从utf8mb3到utf8mb4的转换没有任何问题:
对于BMP字符,utf8mb4和utf8mb3具有相同的存储特性:相同的代码值,相同的编码,相同的长度.
对于补充字符,utf8mb4需要四个字节来存储它,而utf8mb3根本不能存储字符.将utf8mb3列转换为utf8mb4时,您无需担心转换补充字符,因为没有.
就表结构而言,这些是主要的潜在不兼容性:
对于可变长度字符数据类型(VARCHAR和TEXT类型),utf8mb4列的最大允许字符长度小于utf8mb3列.
对于所有字符数据类型(CHAR,VARCHAR和TEXT类型),utf8mb4列的最大可索引字符数少于utf8mb3列.
因此,要将表从utf8mb3转换为utf8mb4,可能需要更改某些列或索引定义.
就个人而言,我遇到了相关长文本索引的一些问题,其中达到了索引的最大大小.它是一个搜索索引,而不是唯一索引,因此解决方法是在索引中使用较少的字符.另见这个答案
当然我想你会使用相同的整理.如果您更改排序规则,则适用其他问题.