主要从排序准确性和性能两方面看:
准确性
utf8mb4_unicode_ci
是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
utf8mb4_general_ci
没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。
但是在绝大多数情况下,这种特殊字符的顺序一定要那么精确吗
。比如Unicode把
ß
、
Œ
当成
ss
和
OE
来看;而general会把它们当成
s
、
e
,再如
ÀÁÅåāă
各自都与
A
相等。
性能
utf8mb4_general_ci
在比较和排序的时候更快
utf8mb4_unicode_ci
在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
但是在绝大多数情况下,不会发生此类复杂比较
。general理论上比Unicode可能快些,但相比现在的CPU来说,它远远不足以成为考虑性能的因素,索引涉及、SQL设计才是。 我个人推荐是
utf8mb4_unicode_ci
,将来 8.0 里也极有可能使用变为默认的规则。相比选择哪一种collation,使用者应该更关心字符集与排序规则在db里要统一就好。
这也从另一个角度告诉我们,不要可能产生乱码的字段作为主键或唯一索引。我遇到过一例,以 url 来作为唯一索引,但是它记录的有可能是乱码,导致后来想把它们修复就特别麻烦。
1、https://my.oschina.net/xsh1208/blog/1052781
2、http://seanlook.com/2016/10/23/mysql-utf8mb4/
声明:本站部分图片或文章内容来源于网络,版权归原作者所有,如有侵权,请与我联系删除。