博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】当我们在使用 navicate for mysql 等第三方客户端管理界面新建一个数据库时,会让我们填入数据库名,并选择字符集和对应的排序规则(可选项),但我们往往只填入数据库名,会忽略字符集和对应的排序规则,但实际上我之前对这个排序规则并不是很了解,所以本文对 MySQL 的排序规则进行简单的总结。
排序规则指的是对指定的字符集下字符的比较规则。它会影响到存储在表中的字符串排序问题,如 order by 语句查询结果的顺序。
当我们选定字符集时,则只能排序规则要选定与 utf8mb4 字符集对应的排序规则,如在选定字符集 utf8mb4 后,会自动列出对应符合的排序规则(一般默认为 utf8mb4_general_ci)。因为 utf8mb4 是推荐使用的,所以下面以选定 utf8mb4 字符集为例。
当然,我们也可以通过 SQL 来设置字符集和排序规则,如下:
create database testdb default charset utf8mb4 collate utf8mb4_general_ci;
查看当前安装的 mysql 版本所能支持的字符集列表(不同的版本支持的结果不一样):
mysql> show char set;
以下三种排序规则的区别:
utf8mb4_general_ci:没有实现 Unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致,但是,在绝大多数情况下,我们不需要对这些特殊字符的顺序要过太精确。校对速度快,但准确度稍差,所以通常情况下都会选择此规则。
utf8mb4_unicode_ci:基于标准的 Unicode 来排序和比较,能够在各种语言之间进行精确排序,在特殊情况下,Unicode 排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法,所以兼容度比较高,但是性能不高。准确度高,但校对速度稍慢。
utf8mb4_bin:将字符串的每个字符用二进制数据编译存储。
后缀区别(参考地址 https://dev.mysql.com/doc/refman/5.6/en/charset-collation-names.html):
_ai Accent-insensitive 指重音不敏感(不区分重音)
_as Accent-sensitive 指重音敏感(区分重音)
_ci Case-insensitive 指大小写不敏感(不区分大小写)
_cs Case-sensitive 指大小写敏感(区分大小写)
_bin Binary 指二进制存储(区分大小写)
接下来用实例来简单说明一下,排序规则是对 order by、where 等关键字有影响的,但是这里没有深入的去研究,这部分只是作为了解排序规则是什么,并不做更多的学习。
mysql> use testdb;
mysql> set names utf8mb4;
mysql> create table user(id int auto_increment primary key,name varchar(255)) engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;
mysql> insert into user(name) values('Mafutian.net');
mysql> insert into user(name) values('MAfutian.net');
mysql> insert into user(name) values('mafutian.net');
mysql> insert into user(name) values('mAfutian.net');
mysql> insert into user(name) values('mAfutian_net');
mysql> select id,name from user order by name collate utf8mb4_general_ci;
+----+--------------+
| id | name |
+----+--------------+
| 1 | Mafutian.net |
| 2 | MAfutian.net |
| 3 | mafutian.net |
| 4 | mAfutian.net |
| 5 | mAfutian_net |
+----+--------------+
mysql> select id,name from user order by name collate utf8mb4_bin;
+----+--------------+
| id | name |
+----+--------------+
| 2 | MAfutian.net |
| 1 | Mafutian.net |
| 4 | mAfutian.net |
| 5 | mAfutian_net |
| 3 | mafutian.net |
+----+--------------+
mysql> select id,name from user order by name collate utf8mb4_unicode_ci;
+----+--------------+
| id | name |
+----+--------------+
| 5 | mAfutian_net |
| 1 | Mafutian.net |
| 2 | MAfutian.net |
| 3 | mafutian.net |
| 4 | mAfutian.net |
+----+--------------+
由此可见(不存在 utf8mb4_unicode_cs),其实 mysql 的排序规则就是对字符的排序的一种方式,不同的规则会对查询结果有不一样的排序,对此咱们只要知道有这么回事,也用不必进行深入的探究,点到即可。
最后小 Tips :mb4 即 most bytes 4
版权归 马富天个人博客 所有
本文标题:《什么是 MySQL 的排序规则(Collation)?》
本文链接地址:http://www.mafutian.com/435.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶1
踩0
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||