mysql的Collation排序规则决定了字符串数据的比较和排序方式,当使用默认的规则处理中文数据时,往往会出现排序结果不符合中文习惯的混乱情况,需要调整对应的排序规则来解决这个问题。

Collation排序规则与中文排序的关系
Collation是和字符集配套使用的排序规则,mysql中常用的utf8字符集默认配套的排序规则是utf8_general_ci,这个规则对中文的排序支持并不完善,会按照字符的编码值进行排序,而不是按照中文的拼音或者笔画顺序,因此会出现中文排序混乱的问题。
要解决中文排序问题,通常会使用utf8_unicode_ci或者utf8mb4_unicode_ci(针对utf8mb4字符集)这类支持更完善 unicode 排序的规则,其中utf8mb4_unicode_ci是现在更推荐的选择,因为它支持所有unicode字符,包括emoji和部分生僻字。
修改数据库级别的Collation
如果需要让新建的表默认使用指定的排序规则,可以先修改数据库的Collation,修改语句如下:
-- 修改现有数据库的字符集和排序规则,替换为你的数据库名 ALTER DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改之后,该数据库下新建的表如果没有指定字符集和排序规则,会默认继承数据库的utf8mb4字符集和utf8mb4_unicode_ci排序规则,能够避免后续新建表出现中文排序问题。
修改现有数据表的Collation
如果已经存在的表出现了中文排序混乱的问题,可以直接修改表的排序规则,同时会自动修改表中所有字符串类型字段的排序规则,语句如下:
-- 修改现有数据表的字符集和排序规则,替换为你的表名 ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
需要注意的是,CONVERT TO关键字会自动转换表中现有字符串字段的字符集和排序规则,不会丢失现有数据,但如果表中已经有大量数据,执行这个操作可能会消耗一定的时间,建议在低峰期操作。
修改单个字段的Collation
如果只需要调整某个字段的排序规则,不需要修改整个表,可以使用如下语句单独修改字段:
-- 修改单个字段的字符集和排序规则,替换为你的表名和字段名 ALTER TABLE user_info MODIFY COLUMN user_name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
修改字段时需要带上字段的完整定义,比如字段类型、是否允许为空、默认值等,否则可能会丢失原有的字段属性。
验证排序规则是否生效
修改完成后,可以通过查询语句验证中文排序是否正常,示例如下:
-- 查询中文数据并按照指定字段排序,查看结果是否符合预期 SELECT user_name FROM user_info ORDER BY user_name COLLATE utf8mb4_unicode_ci;
也可以在查询时临时指定排序规则,不需要修改表结构,适合临时验证或者临时查询的场景,不会改变原有表的结构和数据。
注意事项
- 修改排序规则前建议先备份相关数据,避免操作失误导致数据丢失。
- 如果表中存在索引,修改字段的Collation之后可能需要重建索引,保证索引的有效性。
- 连接mysql的客户端也需要设置正确的字符集,避免客户端和服务器端的字符集不一致导致中文显示异常。