校对规则(Collation)是字符集内部定义的字符比较与排序规则。一个字符集可对应多种校对规则,且拥有一个默认规则。字符集与校对规则彼此依存,共同作用:字符集决定数据存储编码,校对规则决定数据比较逻辑。
在字符集与校对规则的设计上,不同数据库存在理念差异。SQL Server 等数据库将二者耦合,选择字符集即隐含确定了其默认的校对规则。而 MySQL 则采用了显式解耦的设计,允许对字符集和校对规则进行独立配置。在实际使用中,若无特殊排序或比较需求,通常仅指定字符集即可,MySQL 会自动关联该字符集的默认校对规则,确保了操作的简便性。
我们可以通过参数character%来参看当前MySQL的字符集:
变量名 | 值 | 作用说明 |
---|---|---|
character_set_client | gbk | 客户端发送语句的编码。服务器据此解析接收到的SQL语句。 |
character_set_connection | gbk | 连接层使用的编码。服务器将语句从client 转换为此编码进行处理。 |
character_set_database | utf8mb4 | 默认数据库的字符集。当前选中的数据库的编码规则。 |
character_set_filesystem | binary | 文件系统字符集。用于解释文件名,通常设为binary 不进行转换。 |
character_set_results | gbk | 服务器返回结果的编码。包括查询结果、错误信息等将以此编码发送给客户端。 |
character_set_server | utf8mb4 | 服务器默认字符集。未显式指定时,新建数据库和表将继承此设置。 |
character_set_system | utf8mb3 | 系统元数据存储编码。用于存储数据库、表、列名等元数据,由MySQL固定设置。 |
character_sets_dir | C:\... | 字符集文件存储目录。存放字符集定义文件的系统路径。 |
我们可以通过参数collation\_%来参看当前MySQL的校对规则:
变量名 | 值 | 作用说明 |
---|---|---|
collation_connection | gbk_chinese_ci | 当前连接的校对规则。用于字符串比较和排序,继承自character_set_connection 字符集。 |
collation_database | utf8mb4_0900_ai_ci | 默认数据库的校对规则。当前选中的数据库的默认比较和排序规则。 |
collation_server | utf8mb4_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的字符集并显示出来。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程