【mysql8】排序规则--Collations

参考文档

官方介绍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

规则标识说明

标识全拼说明
_ciCase-insensitive大小写不敏感
_csCase-sensitive大小写敏感
_binBinary二进制
_aiAccent-insensitive重音不敏感(不需要关注)
_asAccent-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的不同。

测试结果如下:

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值