前言
MYSQL中关于utf8 COLLATE排序相关的字符集有不少,utf8、utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci,下面来说说它们的区别。
utf8
MYSQL中的utf8其实是utf8mb3,最大字符长度为3字节,如果遇到4字节的宽字符插入就会异常。
最大为3字节的utf8字符集能编码的最大unicode字符是0xffff,即unicode编码中的基本多文种平面(BMP)编码区段。也就是说,任何不在unicode字符集基本多文种平面(BMP)编码区段的字符,都无法使用MYSQL的utf8字符集,包括Emoji表情(Emoji 是一种特殊的 unicode 编码,常见于 ios 和 android 手机上)、很多不常用的汉字和任何新增的unicode字符等。
总结:优点是节省空间,但是不能表达全部的utf8字符,推荐使用utf8mb4。
utf8mb4_bin
mb4
即 most bytes 4,最多使用4个字节表示字符,能够表示全部的unicode字符。
bin
表示将字符串每个字符用二进制数据编译存储,区分大小写,可以存二进制内容。
utf8mb4_general_ci
ci
即 case insensitive,不区分大小写。没有实现unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
utf8mb4_unicode_ci
基于标准的unicode来排序和比较,能够在各种语言之间精确排序,unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
general_ci VS unicode_ci
general_ci 更快,unicode_ci 更准确。但相比现在的CPU来说,它远远不足以成为考虑性能的因素,索引涉及、SQL设计才是。使用者更应该关心字符集与排序规则在db里需要统一(可能产生乱码的字段不要作为主键或唯一索引,例如:以 url 来作为唯一索引,但是它记录的有可能是乱码)。
参考:
Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别