什么是 MySQL 的排序规则(Collation)?

学习笔记 马富天 2020-01-19 14:56:58 51 0

【摘要】当我们在使用 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 版本所能支持的字符集列表(不同的版本支持的结果不一样):

  1. 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 等关键字有影响的,但是这里没有深入的去研究,这部分只是作为了解排序规则是什么,并不做更多的学习。

  1. mysql> use testdb;
  2. mysql> set names utf8mb4;
  3. mysql> create table user(id int auto_increment primary key,name varchar(255)) engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;
  4. mysql> insert into user(name) values('Mafutian.net');
  5. mysql> insert into user(name) values('MAfutian.net');
  6. mysql> insert into user(name) values('mafutian.net');
  7. mysql> insert into user(name) values('mAfutian.net');
  8. mysql> insert into user(name) values('mAfutian_net');
  9. mysql> select id,name from user order by name collate utf8mb4_general_ci;
  10. +----+--------------+
  11. | id | name         |
  12. +----+--------------+
  13. |  1 | Mafutian.net |
  14. |  2 | MAfutian.net |
  15. |  3 | mafutian.net |
  16. |  4 | mAfutian.net |
  17. |  5 | mAfutian_net |
  18. +----+--------------+
  19. mysql> select id,name from user order by name collate utf8mb4_bin;
  20. +----+--------------+
  21. | id | name         |
  22. +----+--------------+
  23. |  2 | MAfutian.net |
  24. |  1 | Mafutian.net |
  25. |  4 | mAfutian.net |
  26. |  5 | mAfutian_net |
  27. |  3 | mafutian.net |
  28. +----+--------------+
  29. mysql> select id,name from user order by name collate utf8mb4_unicode_ci;
  30. +----+--------------+
  31. | id | name         |
  32. +----+--------------+
  33. |  5 | mAfutian_net |
  34. |  1 | Mafutian.net |
  35. |  2 | MAfutian.net |
  36. |  3 | mafutian.net |
  37. |  4 | mAfutian.net |
  38. +----+--------------+

由此可见(不存在 utf8mb4_unicode_cs),其实 mysql 的排序规则就是对字符的排序的一种方式,不同的规则会对查询结果有不一样的排序,对此咱们只要知道有这么回事,也用不必进行深入的探究,点到即可。

最后小 Tips :mb4 即 most bytes 4

版权归 马富天个人博客 所有

本文标题:《什么是 MySQL 的排序规则(Collation)?》

本文链接地址:http://www.mafutian.com/435.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

1

0

上一篇《 请不要再在 MySQL、Mariadb 中使用 "utf8" ,要采用 "utf8mb4" 》 下一篇《 MySQL 中的 using 用法 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多