当前位置:首页 > 问答 > 正文

数据库|排序规则:mysql默认排序;MySQL默认排序为中心

MySQL默认排序规则详解

场景引入:突然乱码的客户名单

市场部的小张最近遇到个怪事——他从MySQL导出的客户名单里,"张三"突然排在了"李四"后面,而Excel里明明是按拼音顺序排好的,技术部的老王看了一眼就笑了:"你这问题啊,是没搞懂MySQL的默认排序规则在作怪!"

MySQL的默认排序规则是什么?

MySQL的默认排序规则(Collation)实际上是utf8mb4_general_ci(5.7+版本)或utf8mb4_0900_ai_ci(8.0+版本),这个拗口的名字包含三个关键信息:

  1. utf8mb4:支持完整的Unicode字符(包括emoji)
  2. general/0900:排序算法版本(0900是更精准的Unicode 9.0标准)
  3. ci:Case Insensitive(大小写不敏感)

默认排序的三大特点

大小写?不存在的!

当排序规则带_ci后缀时:

数据库|排序规则:mysql默认排序;MySQL默认排序为中心

SELECT * FROM users ORDER BY name;
-- 结果可能是:apple, Banana, cherry(B和b被视为相同)

口音符号被"忽略"

é、è、ê等会被当作普通e处理:

-- 'café'和'cafe'可能被排在一起

中文排序的玄学

对于中文字符:

  • 7版本:按字符编码值粗略排序
  • 0+版本:支持按拼音排序(需确保字符集为utf8mb4_zh_0900_as_cs)

为什么我的排序结果和想象不一样?

常见踩坑场景:

数据库|排序规则:mysql默认排序;MySQL默认排序为中心

  1. 混合语言数据:英文数字和中文混排时,编码值可能产生意外顺序
  2. VARCHAR比较:'10'会排在'2'前面(按字符逐位比较)
  3. 隐式类型转换:字符串数字被转为数值时,'2'可能突然大于'10'

如何掌控排序规则?

查询当前规则

SHOW VARIABLES LIKE 'collation%';
-- 全局规则:collation_server
-- 连接规则:collation_connection

指定排序规则(三种方式)

建表时指定

CREATE TABLE users (
    name VARCHAR(50) COLLATE utf8mb4_unicode_ci
) DEFAULT COLLATE=utf8mb4_unicode_ci;

查询时临时指定

SELECT * FROM products ORDER BY name COLLATE utf8mb4_bin;

修改连接配置

数据库|排序规则:mysql默认排序;MySQL默认排序为中心

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_zh_0900_as_cs';

专业建议

  1. 一致性优先:整个项目建议统一排序规则
  2. 中文场景:MySQL 8.0+推荐使用utf8mb4_zh_0900_as_cs
  3. 精确匹配:密码等需要区分大小写时用_bin规则

下次当数据排序结果让你挠头时,记得先检查那个藏在角落的COLLATE属性——它可能就是幕后"真凶"。

发表评论