首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 中文排序實戰:用 CONVERT 函數實現拼音/筆畫順序

     編輯:MySQL 資料庫相關知識

背景與問題

MySQL 默認字符集 utf8 / utf8mb4 下,ORDER BY name 按字符編碼值排序,中文姓名無法按拼音或筆畫順序輸出。業務常見需求:通訊錄、學生名單需按「李、王、張、劉」拼音序或筆畫序展示。

解決方案:CONVERT(... USING gbk)

利用 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,'錢七');

查詢結果對比

排序方式idname
ORDER BY CONVERT(name USING gbk) ASC2李四
4馬六
5錢七
3王五
1張三
ORDER BY CONVERT(name USING gbk) DESC1張三
3王五
5錢七
4馬六
2李四

進階技巧與注意事項

  • 簽證/多音字:gbk 排序基於首字拼音,多音字可能不準;嚴格業務可建立 pinyin 輔助列存儲全拼。
  • 筆畫排序:MySQL 8.0+ 支持 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 建議直接使用原生中文校對規則,更標準、高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved