MySQL 排序规则Collation实例详解

 更新时间:2025年07月21日 09:10:23   作者:数据派  
本文将从基础概念出发,详解排序规则的作用、与字符集的关系、查看与配置方法,并通过实际案例说明其对查询结果的影响,帮助开发者精准控制数据匹配行为,感兴趣的朋友一起看看吧

在 MySQL 中,排序规则(Collation)是控制字符比较方式的核心机制,直接影响查询结果的排序、匹配逻辑(如大小写区分)等。本文将从基础概念出发,详解排序规则的作用、与字符集的关系、查看与配置方法,并通过实际案例说明其对查询结果的影响,帮助开发者精准控制数据匹配行为。

一、排序规则的核心概念

排序规则(Collation)是字符集(Character Set)的 "配套规则",定义了字符之间的比较、排序逻辑。其核心作用体现在两个维度:

  • 大小写区分:是否将'a''A'视为相同字符;
  • 编码适配:针对特定字符集(如 UTF-8)的语言特性(如 accents 字符)制定比较规则。

例如,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. 查看字符集与排序规则信息

查看所有字符集及其默认排序规则:

-- 方法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'; -- 替换为数据库名

2. 不同对象的排序规则设置

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'会原样保存),但直接决定查询时的匹配逻辑。以下通过测试案例验证:

测试环境

  • MySQL 版本:8.0.28
  • 测试表:test_db.a(字段ichar(1)类型)

案例 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'(两者被视为相同)

案例 2:区分大小写的排序规则(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排序规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySql中的IFNULL、NULLIF和ISNULL用法详解

    MySql中的IFNULL、NULLIF和ISNULL用法详解

    在做项目中发现MySql里的isnull和mssql里的有点不同。接下来小编通过本文给大家介绍MySql中的IFNULL、NULLIF和ISNULL用法详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 简单介绍下MYSQL的索引类型

    简单介绍下MYSQL的索引类型

    本文介绍了七种MySQL索引类型。在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和运行更加高效。
    2015-07-07
  • 最全50个Mysql数据库查询练习题

    最全50个Mysql数据库查询练习题

    这篇文章主要介绍了最全50个数据库查询练习题,Mysql数据库版本,全部都验证过
    2020-12-12
  • MySQL数据库服务器端核心参数详解和推荐配置

    MySQL数据库服务器端核心参数详解和推荐配置

    MySQL手册上也有服务器端参数的解释,以及参数值的相关说明信息,现针对我们大家重点需要注意、需要修改或影响性能 的服务器端参数,作其用处的解释和如何配置参数值的推荐,此事情拖了不少时间,为方便大家帮忙纠错
    2011-12-12
  • MySQL Order By Rand()效率分析

    MySQL Order By Rand()效率分析

    本文详细解说了MySQL Order By Rand()效率优化的方案,并给出了优化的思路过程,是篇不可多得的MySQL Order By Rand()效率美文
    2012-07-07
  • MySQL错误ERROR 1615 解决方法

    MySQL错误ERROR 1615 解决方法

    这篇文章主要介绍了MySQL错误ERROR 1615 解决方法,这个问题是由于Mysql配置不当造成的,需要的朋友可以参考下
    2015-01-01
  • 详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    本篇文章主要介绍了buntu Server下启动/停止/重启MySQL数据库的三种方式,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • 聊聊MySQL事务的特性和隔离级别

    聊聊MySQL事务的特性和隔离级别

    这篇文章主要介绍了MySQL事务的特性和隔离级别的相关资料,帮助大家粗略的认识下MySQL 事务的相关知识,感兴趣的朋友可以了解下
    2020-09-09
  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    深入研究mysql中的varchar和limit(容易被忽略的知识)

    这篇文章主要介绍了深入研究mysql中的varchar和limit(容易被忽略的知识),本文探究了varchar(5)可以存储多少个汉字、多少个字母数字和mysql中的limit你真的会用吗两个知识点,需要的朋友可以参考下
    2015-03-03
  • MYSQL中锁的分类与加锁方式小结

    MYSQL中锁的分类与加锁方式小结

    MySQL通过表级锁和行级锁两种机制来控制并发事务对数据的访问,以避免数据不一致、脏读和幻读等问题,表级锁包括显式锁、元数据锁和意向锁,而行级锁包括记录锁、间隙锁和临键锁,本文介绍MYSQL中锁的分类与加锁方式小结,感兴趣的朋友跟随小编一起看看吧
    2026-03-03

最新评论