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

MySQL 中文排序問題完整解決方案

     編輯:MySQL 資料庫相關知識

MySQL 中文排序失效的根本原因

MySQL 在編譯時預設使用 ISO-8859-1 (latin1) 字符集,導致中文編碼在比較過程中發生大小寫轉換錯誤,使得 ORDER BY 對漢字的排序結果錯誤。這個問題存在於許多 MySQL 版本中,嚴重影響中文數據處理。

三種主流解決方案

方案一:欄位添加 BINARY 屬性(最快捷)

將包含中文的字段定義為二進制比較模式:

ALTER TABLE `table_name` MODIFY `chinese_column` VARCHAR(10) BINARY;

或建表時直接指定:name CHAR(10) BINARY。此法強制按字節值排序,繞過字符集校對規則。

方案二:編譯/配置指定字符集(徹底解決)

  • 源碼編譯:加入 --with-charset=gbk 或 --with-extra-charsets=gb2312,gbk
  • 配置文件:在 my.cnf 的 [mysqld] 區塊設置 character-set-server=gbk 並重啟服務

預設校對集 utf8_general_ci 不按拼音/筆畫排序,需顯式指定中文校對集。

方案三:查詢層面使用 CONVERT 函數(無需改結構)

SELECT * FROM `table_name` 
ORDER BY CONVERT(`chinese_column` USING gbk) COLLATE gbk_chinese_ci;

此法臨時將欄位轉為 GBK 編碼並套用中文校對規則,適合無法修改表結構的場景。

最佳實踐建議

  1. 新專案建議直接使用 utf8mb4 字符集並搭配 utf8mb4_unicode_ci 或 utf8mb4_zh_0900_as_cs(MySQL 8.0+)
  2. 遷移舊庫時優先考慮方案三驗證,再決定是否執行方案一或二
  3. 排序效能測試:CONVERT 會導致全表掃描,大數據量建議加索引或採用方案一/二

掌握這三種方案,即可徹底解決 MySQL 中文排序亂序問題,確保業務查詢結果符合預期。

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