校对规则(Collation)是字符集内部定义的字符比较与排序规则。一个字符集可对应多种校对规则,且拥有一个默认规则。字符集与校对规则彼此依存,共同作用:字符集决定数据存储编码,校对规则决定数据比较逻辑。

在字符集与校对规则的设计上,不同数据库存在理念差异。SQL Server 等数据库将二者耦合,选择字符集即隐含确定了其默认的校对规则。而 MySQL 则采用了显式解耦的设计,允许对字符集和校对规则进行独立配置。在实际使用中,若无特殊排序或比较需求,通常仅指定字符集即可,MySQL 会自动关联该字符集的默认校对规则,确保了操作的简便性。

我们可以通过参数character%来参看当前MySQL的字符集:

查看字符集

变量名作用说明
character_set_clientgbk客户端发送语句的编码。服务器据此解析接收到的SQL语句。
character_set_connectiongbk连接层使用的编码。服务器将语句从client转换为此编码进行处理。
character_set_databaseutf8mb4默认数据库的字符集。当前选中的数据库的编码规则。
character_set_filesystembinary文件系统字符集。用于解释文件名,通常设为binary不进行转换。
character_set_resultsgbk服务器返回结果的编码。包括查询结果、错误信息等将以此编码发送给客户端。
character_set_serverutf8mb4服务器默认字符集。未显式指定时,新建数据库和表将继承此设置。
character_set_systemutf8mb3系统元数据存储编码。用于存储数据库、表、列名等元数据,由MySQL固定设置。
character_sets_dirC:\...字符集文件存储目录。存放字符集定义文件的系统路径。

我们可以通过参数collation\_%来参看当前MySQL的校对规则:

校对规则

变量名作用说明
collation_connectiongbk_chinese_ci当前连接的校对规则。用于字符串比较和排序,继承自character_set_connection字符集。
collation_databaseutf8mb4_0900_ai_ci默认数据库的校对规则。当前选中的数据库的默认比较和排序规则。
collation_serverutf8mb4_0900_ai_ci服务器默认校对规则。未显式指定时,新建数据库和表将继承此规则。

下面这张表格清晰地介绍了校对规则命令约定:

组成部分含义说明实例
字符集前缀标识此规则所属的字符集,决定了其处理的编码范围。utf8mb4_gbk_latin1_
语言/通用标识指明规则的语言倾向或通用类型,影响字符的排序顺序。general_(通用)、chinese_(中文)、german_(德语)
比较后缀核心规则,强制规定字符串比较时是否区分大小写、重音等语义。ci(不区分大小写)、cs(区分大小写)、bin(二进制比较)

MySQL是如何进行字符集转换呢?

客户端发送:您在cmd中输入的命令,首先从cmd的字符集(如GBK)转换为 character_set_client 指定的字符集。

连接层转换:命令到达连接层,服务器将其从 character_set_client 转换为 character_set_connection 字符集,用于语句的内部处理。

服务器层转换:服务器收到命令后,继续将其从 character_set_connection 转换为 character_set_server 字符集。

数据库层转换(可选):如果命令操作特定数据库,则会进一步从 character_set_server 转换为该数据库的字符集(即 character_set_database)。

结果返回:命令执行完毕后,服务器将结果数据转换为 character_set_results 指定的字符集。

客户端接收:结果沿原路返回,最终在客户端转换为cmd的字符集并显示出来。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)