参考文档
官方介绍Character Sets(字符集), Collations(排序规则)的章节:
https://dev.mysql.com/doc/refman/8.0/en/charset.html
关于Collations(排序规则)比较细致的子章节:
https://dev.mysql.com/doc/refman/8.0/en/charset-collations.html
Collations(排序规则)命名规则:
https://dev.mysql.com/doc/refman/8.0/en/charset-collation-names.html
以下内容编写基于mysql 8.0.26版本。
定义
Collations(排序规则)是mysql在对比两个对象大小时使用的规则集合。
在需要比对大小的场景下都需要使用,比如:=,>,<,order by,group by,distinct,max()等。
具体可参考:https://dev.mysql.com/doc/refman/8.0/en/charset-collate.html
命名规则
可以通过show collation语句查看mysql 支持的排序规则。
collation名称基本是由以下规则生成
{字符集}_{地域信息,非必需}_{排序规则版本,非必需}_{规则标识}
以utf8mb4_0900_ai_ci 和utf8mb4_cs_0900_ai_ci来说明。
类型 | 值 | 说明 |
---|---|---|
字符集 | utf8mb4 | |
地域信息 | cs | 参考以下文档的Language-Specific Collations部分 https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html |
排序规则版本 | 0900 | 基于UCA 9.0.0 weight keys (http://www.unicode.org/Public/UCA/9.0.0/allkeys.txt) |
规则标识 | ai_ci | 具体规则参考文档 https://dev.mysql.com/doc/refman/8.0/en/charset-collation-names.html |
规则标识说明
标识 | 全拼 | 说明 |
---|---|---|
_ci | Case-insensitive | 大小写不敏感 |
_cs | Case-sensitive | 大小写敏感 |
_bin | Binary | 二进制 |
_ai | Accent-insensitive | 重音不敏感(不需要关注) |
_as | Accent-sensitive | 重音敏感(不需要关注) |
影响测试:
做一个测试,对排序规则有个直观感受
---建表,分别使用四个不同的排序规则建四个字段
CREATE TABLE `wjf_test_collation` (
`ci_900` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`cs_900` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs DEFAULT NULL,
`bin_900` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin DEFAULT NULL,
`bin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
---插入数据如下
select * from wjf_test_collation;
+--------+--------+---------+------+
| ci_900 | cs_900 | bin_900 | bin |
+--------+--------+---------+------+
| a | a | a | a |
| A | A | A | A |
+--------+--------+---------+------+
2 rows in set (0.00 sec)
---查询测试(不区分大小写)
select * from wjf_test_collation where ci_900 = 'a';
+--------+--------+---------+------+
| ci_900 | cs_900 | bin_900 | bin |
+--------+--------+---------+------+
| a | a | a | a |
| A | A | A | A |
+--------+--------+---------+------+
2 rows in set (0.00 sec)
---查询测试(区分大小写)
select * from wjf_test_collation where cs_900 = 'a';
+--------+--------+---------+------+
| ci_900 | cs_900 | bin_900 | bin |
+--------+--------+---------+------+
| a | a | a | a |
+--------+--------+---------+------+
1 row in set (0.00 sec)
---查询测试(a后面存在多个空格)
select * from wjf_test_collation where bin_900 = 'a ';
Empty set (0.00 sec)
---查询测试(a后面存在多个空格)
select * from wjf_test_collation where bin = 'a ';
+--------+--------+---------+------+
| ci_900 | cs_900 | bin_900 | bin |
+--------+--------+---------+------+
| a | a | a | a |
+--------+--------+---------+------+
1 row in set (0.01 sec)
优先级
如果对比的两个对象的排序规则不同,对需要使用的规则优先级说明文档如下:
https://dev.mysql.com/doc/refman/8.0/en/charset-collation-coercibility.html
utf8mb4_*和utf8mb4_0900_*区别
在mysql 8.0.26版本中,存在两个utf8mb4排序版本:
带900的版本
不带900的版本
其实看起来不带900的版本跟mysql 5.7的写法有些类似。
从上面的图可以看出,两个版本的pad attribute属性不同,一个是NO PAD,一个是PAD SPACE。
区别可以参考如下:https://dev.mysql.com/doc/refman/8.0/en/charset-binary-collations.html
对于PAD SPACE,对比的时候,'a’是等于’a '的。
对于NO PAD,对比的时候,'a’是不等于’a '的。
这也是5.7版本的utf8mb4_general_ci和8.0版本的utf8mb4_0900_ai_ci的不同。
测试结果如下: