mysql数据库字符集utf8mb4和排序规则utf8mb4_bin

发布时间 2023-12-20 10:45:06作者: 邢帅杰

一、存储字符集 utf8 和 utf8mb4
1、utf8
utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面
2、utf8mb4
要在 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。

二、排序字符集
utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci
MySQL常用排序规则utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin_ci

ci 是 case insensitive,不区分大小写,即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的。
bin 是二进制, a 和 A 会别区别对待(例如运行SELECT * FROM table WHERE txt = 'a', 那么在utf8mb4_bin中就找不到 txt = 'A' 的那一行, 而 utf8mb4_general_ci 则可以)

1、utf8mb4_unicode_ci:
是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法

2、utf8mb4_general_ci:
是一个遗留的 校对规则,不支持扩展,它仅能够在字符之间进行逐个比较,不区分大小写, utf8mb4_general_cs 区分大小写。
utf8_general_ci校对规则进行的比较速度很快,但是与使用 utf8mb4_unicode_ci的校对规则相比,比较正确性较差。

3、utf8mb4_bin:
将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。

4、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 代替。

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字符集校对规则。例如,对于德语和法语,utf8mb4_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8mb4校对规则。
utf8mb4_general_ci 也适用德语、法语或者俄语,但会有不准。如果你的应用能够接受这些,那么应该使用 utf8mb4_general_ci,因为它速度快。
否则,使用utf8mb4_unicode_ci,因为它比较准确。

虽然推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。
因为utf8mb4_unicode_ci比较准确,utf8mb4_general_ci速度比较快。通常情况下,新建数据库 和 建 varchar字符集类型字段 时一般选用 utf8mb4_general_ci 就可以。

版权声明:本文为CSDN博主「MinggeQingchun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MinggeQingchun/article/details/129858039