17人参与 • 2025-07-21 • Mysql
在 mysql 中,排序规则(collation)是控制字符比较方式的核心机制,直接影响查询结果的排序、匹配逻辑(如大小写区分)等。本文将从基础概念出发,详解排序规则的作用、与字符集的关系、查看与配置方法,并通过实际案例说明其对查询结果的影响,帮助开发者精准控制数据匹配行为。
排序规则(collation)是字符集(character set)的 "配套规则",定义了字符之间的比较、排序逻辑。其核心作用体现在两个维度:
'a'
和'a'
视为相同字符;例如,utf-8 字符集的utf8mb4_0900_ai_ci
排序规则中:
ai
表示 "accent-insensitive"(忽略重音);ci
表示 "case-insensitive"(忽略大小写);utf8mb4_0900_as_cs
中,as
(accent-sensitive)和cs
(case-sensitive)则表示区分重音和大小写。字符集与排序规则是 "一对多" 的关系:一个字符集可以对应多个排序规则,但每个排序规则仅属于一个字符集。两者的默认关联规则如下:
utf8mb4
默认排序规则为utf8mb4_0900_ai_ci
);utf8mb4_general_ci
,字符集即为utf8mb4
)。查看所有字符集及其默认排序规则:
-- 方法1:show命令 show character set; -- 方法2:查询系统表 select * from information_schema.character_sets;
查看指定字符集的所有排序规则:
-- 查看utf8mb4字符集的所有排序规则 show collation where charset = 'utf8mb4';
查看数据库的默认字符集与排序规则:
-- 方法1:使用系统变量 use test_db; -- 切换到目标数据库 select @@character_set_database, @@collation_database; -- 方法2:查询系统表 select default_character_set_name, default_collation_name from information_schema.schemata where schema_name = 'test_db'; -- 替换为数据库名
mysql 中,排序规则可在服务器、数据库、表、列、字符串五个层级设置,下层默认继承上层配置(可单独覆盖)。
对象 | 字符集设置方式 | 排序规则设置方式 | 说明 |
---|---|---|---|
服务器 | character_set_server 系统变量 | collation_server 系统变量 | 未指定时,数据库默认继承服务器配置 |
数据库 | 建库时 character set 子句 | 建库时 collate 子句 | 未指定时,表默认继承数据库配置 |
表 | 建表时 character set 子句 | 建表时 collate 子句 | 未指定时,列默认继承表配置 |
列 | 字段定义中 character set 子句 | 字段定义中 collate 子句 | 最细粒度控制,直接影响字段查询逻辑 |
字符串常量 | select _utf8mb4'abc' | select 'abc' collate utf8mb4_general_ci | 临时指定,覆盖连接级别的默认规则 |
排序规则不影响数据存储(存入的'a'
和'a'
会原样保存),但直接决定查询时的匹配逻辑。以下通过测试案例验证:
test_db.a
(字段i
为char(1)
类型)utf8mb4_0900_ai_ci
)-- 设置字段排序规则为忽略大小写 alter table test_db.a change i i char(1) collate utf8mb4_0900_ai_ci; -- 插入数据 insert into test_db.a values ('a'), ('a'); -- 查询:条件为'i = 'a'' select * from test_db.a where i = 'a'; -- 结果:返回'a'和'a'(两者被视为相同)
utf8mb4_0900_as_cs
)-- 设置字段排序规则为区分大小写 alter table test_db.a change i i char(1) collate utf8mb4_0900_as_cs; -- 插入数据(同上) insert into test_db.a values ('a'), ('a'); -- 查询:条件为'i = 'a'' select * from test_db.a where i = 'a'; -- 结果:仅返回'a'(严格区分大小写)
*_cs
(case-sensitive)类型;*_ci
(case-insensitive)类型。明确大小写需求:根据业务场景选择排序规则。例如,用户名通常需要区分大小写(用*_cs
),而商品名称可能忽略大小写(用*_ci
)。
统一配置层级:建议在数据库或表级别统一设置排序规则,避免列级别配置混乱(特殊字段单独覆盖)。
查询时临时覆盖:如需临时改变匹配逻辑,可在查询中指定排序规则:
-- 临时按区分大小写查询(即使字段默认不区分) select * from test_db.a where i collate utf8mb4_0900_as_cs = 'a';
注意连接级影响:客户端连接的collation_connection
变量会影响字符串常量的匹配逻辑,若需一致行为,建议在字段级别显式指定排序规则。
mysql 排序规则是控制字符比较逻辑的关键机制,其核心作用体现在查询阶段的匹配与排序行为。通过理解字符集与排序规则的关联、掌握多层级配置方法,并结合业务场景选择合适的规则(如区分 / 忽略大小写),可确保查询结果符合预期,避免因字符匹配问题导致的业务异常。
到此这篇关于mysql 排序规则collation实例详解的文章就介绍到这了,更多相关mysql排序规则内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论