欢迎光临
专业Linux运维二十年

MySQL 排序规则Collation实例详解

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

      一、排序规则的核心概念

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

      例如,UTF-8 字符集的utf8mb4_0900_ai_ci排序规则中:

      二、字符集与排序规则的关联

      字符集与排序规则是 “一对多” 的关系:一个字符集可以对应多个排序规则,但每个排序规则仅属于一个字符集。两者的默认关联规则如下:

      三、排序规则的查看与配置

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

      测试环境

      案例 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'(严格区分大小写)

      结论

      五、实践建议

      查询时临时覆盖:如需临时改变匹配逻辑,可在查询中指定排序规则:

      -- 临时按区分大小写查询(即使字段默认不区分)
      SELECT * FROM test_db.a WHERE i COLLATE utf8mb4_0900_as_cs = 'a';

      总结

      MySQL 排序规则是控制字符比较逻辑的关键机制,其核心作用体现在查询阶段的匹配与排序行为。通过理解字符集与排序规则的关联、掌握多层级配置方法,并结合业务场景选择合适的规则(如区分 / 忽略大小写),可确保查询结果符合预期,避免因字符匹配问题导致的业务异常。

      到此这篇关于MySQL 排序规则Collation实例详解的文章就介绍到这了,

      脚本之家
      赞(0) 打赏
      未经允许不得转载:Linux老运维 » MySQL 排序规则Collation实例详解

      觉得文章有用就打赏一下文章作者

      非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

      支付宝扫一扫

      微信扫一扫