MySQL 中文排序(拼音排序)不生效问题全解析
💡 MySQL 中文排序(拼音排序)不生效问题全解析
📍 问题背景
在 MySQL 中使用中文数据进行排序时,可能出现以下现象:
当前数据库字符集:utf8mb4_general_ci
排序结果:
呀项目2
啊项目3
项目1
按理说应该是:
啊项目3
呀项目2
项目1
为什么会出现这种问题?该如何解决?
🧩 一、问题原因
默认的排序规则 utf8mb4_general_ci
并不真正理解中文。
它的排序逻辑只是按 Unicode 编码点大小排序,而不是按拼音或笔画。
字符 | Unicode | 排序结果 |
---|---|---|
呀 | 5440 | 1️⃣ |
啊 | 554A | 2️⃣ |
项 | 9879 | 3️⃣ |
所以 MySQL 认为 “呀 < 啊 < 项”,导致排序看起来“不对”。
✅ 二、正确的解决方案(MySQL 8.0+)
MySQL 8.0 引入了中文拼音排序支持规则:
utf8mb4_zh_0900_as_cs
含义解释:
zh
:中文(Chinese)_0900_
:Unicode 9.0 排序算法as
:accent-sensitive(区分声调)cs
:case-sensitive(区分大小写)
示例 SQL:
SELECT name
FROM audit_keyData
ORDER BY name COLLATE utf8mb4_zh_0900_as_cs;
结果为正确的拼音顺序:
啊项目3
呀项目2
项目1
⚙️ 三、在 Midway / TypeORM 中的实践
在 Midway 项目中,通常使用 TypeORM 查询。
如果直接写: