在创建数据库时,我们经常会需要填写数据库名、字符集、排序规则。
而本文主要讲述常用的存储字符集 utf8 和 utf8mb4;排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
一般我本人创建创建数据库通常排序规则都使用utf8mb4_general_ci,因为对特殊字符的顺序并不需要那么精确。
1、存储字符集 utf8 和 utf8mb4
utf8 是 mysql 中的一种字符集,只支持最长三个字节的 utf-8 字符,也就是 unicode 中的基本多文本平面。
要在 mysql 中保存 4 字节长度的 utf-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.对于 char 类型数据,utf8mb4 会多消耗一些空间,根据 mysql 官方建议,使用 varchar 替代 char
总结:
utf-8是使用1~4个字节,一种变长的编码格式,字符编码。mb4即 most bytes 4,使用4个字节来表示完整的utf-8。
mysql的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 utf-8 最大能编码的 unicode 字符是 0xffff,也就是 unicode 中的基本多文种平面(bmp)。也就是说,任何不在基本多文本平面的 unicode字符,都无法使用 mysql 的 utf8 字符集存储。包括 emoji 表情(emoji 是一种特殊的 unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 unicode 字符等等。
mysql的utf8是utfmb3,只有三个字节,节省空间但不能表达全部的utf-8。所以推荐使用utf8mb4(是utf8的超集并完全兼容它,能够用四个字节存储更多的字符,这几乎包含了世界上所有能看到见的语言。)。
2、排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
mysql常用排序规则utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin
ci即case insensitive,不区分大小写。
utf8mb4_unicode_ci:
是基于标准的unicode来排序和比较,能够在各种语言之间精确排序,unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
utf8mb4_general_ci:
是一个遗留的 校对规则,不支持扩展,它仅能够在字符之间进行逐个比较。utf8_general_ci校对规则进行的比较速度很快,但是与使用 utf8mb4_unicode_ci的校对规则相比,比较正确性较差。
utf8mb4_bin:
将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。
utf8mb4_0900_ai_ci:
mysql 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:
uft8mb4 表示用 utf-8 编码方案,每个字符最多占 4 个字节。
0900 指的是 unicode 校对算法版本。(unicode 归类算法是用于比较符合 unicode 标准要求的两个 unicode 字符串的方法)。
ai 指的是口音不敏感。也就是说,排序时 e,è,é,ê 和 ë 之间没有区别。
ci 表示不区分大小写。也就是说,排序时 p 和 p 之间没有区别。
utf8mb4 已成为默认字符集,在 mysql 8.0.1 及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。以前,utf8mb4_general_ci 是默认排序规则。由于 utf8mb4_0900_ai_ci 排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。如果需要重音灵敏度和区分大小写,则可以使用 utf8mb4_0900_as_cs 代替。
2.1、经常使用的 utf8mb4_unicode_ci 和 utf8mb4_general_ci 的区别。
1、准确性
utf8mb4_unicode_ci 是基于标准的 unicode 来排序和比较,能够在各种语言之间精确排序。
utf8mb4_general_ci 没有实现 unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。
但是绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
2、性能
utf8mb4_general_ci 在比较和排序的时候更快。
utf8mb4_unicode_ci 在特殊情况下,unicode 排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
但是在绝大多数情况下,不会发生此类复杂比较。相比选择哪一种 collation,使用者更应该关心字符集与排序规则在 db 里需要统一。
推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。
- 编程问答
- 答案列表
MySQL utf8mb4_unicode_ci 什么版本开始支持[朗读]
加入收藏