MySQL 默認字符集 utf8 / utf8mb4 下,ORDER BY name 按字符編碼值排序,中文姓名無法按拼音或筆畫順序輸出。業務常見需求:通訊錄、學生名單需按「李、王、張、劉」拼音序或筆畫序展示。
利用 gbk 字符集中漢字按拼音順序編碼的特性,將排序字段臨時轉換為 gbk 再比較:
-- 正序(拼音升序)
SELECT * FROM person ORDER BY CONVERT(name USING gbk);
-- 倒序(拼音降序)
SELECT * FROM person ORDER BY CONVERT(name USING gbk) DESC;
CREATE TABLE `person` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `person` VALUES
(1,'張三'),(2,'李四'),(3,'王五'),(4,'馬六'),(5,'錢七');
| 排序方式 | id | name |
|---|---|---|
| ORDER BY CONVERT(name USING gbk) ASC | 2 | 李四 |
| 4 | 馬六 | |
| 5 | 錢七 | |
| 3 | 王五 | |
| 1 | 張三 | |
| ORDER BY CONVERT(name USING gbk) DESC | 1 | 張三 |
| 3 | 王五 | |
| 5 | 錢七 | |
| 4 | 馬六 | |
| 2 | 李四 |
pinyin 輔助列存儲全拼。utf8mb4_zh_0900_as_cs 等按筆畫、部首排序的校對規則,可直接 COLLATE utf8mb4_zh_0900_as_cs 使用。CONVERT 會導致全表掃描且無法用索引;建議冗余 name_gbk 列並建索引,或用生成列(Generated Column)自動維護。CONVERT(... USING gbk) 是 MySQL 5.6/5.7 時代零成本實現中文拼音排序的經典技巧;MySQL 8.0 建議直接使用原生中文校對規則,更標準、高效。