MySQL 在編譯時預設使用 ISO-8859-1 (latin1) 字符集,導致中文編碼在比較過程中發生大小寫轉換錯誤,使得 ORDER BY 對漢字的排序結果錯誤。這個問題存在於許多 MySQL 版本中,嚴重影響中文數據處理。
將包含中文的字段定義為二進制比較模式:
ALTER TABLE `table_name` MODIFY `chinese_column` VARCHAR(10) BINARY;
或建表時直接指定:name CHAR(10) BINARY。此法強制按字節值排序,繞過字符集校對規則。
--with-charset=gbk 或 --with-extra-charsets=gb2312,gbkmy.cnf 的 [mysqld] 區塊設置 character-set-server=gbk 並重啟服務預設校對集 utf8_general_ci 不按拼音/筆畫排序,需顯式指定中文校對集。
SELECT * FROM `table_name`
ORDER BY CONVERT(`chinese_column` USING gbk) COLLATE gbk_chinese_ci;
此法臨時將欄位轉為 GBK 編碼並套用中文校對規則,適合無法修改表結構的場景。
utf8mb4 字符集並搭配 utf8mb4_unicode_ci 或 utf8mb4_zh_0900_as_cs(MySQL 8.0+)CONVERT 會導致全表掃描,大數據量建議加索引或採用方案一/二掌握這三種方案,即可徹底解決 MySQL 中文排序亂序問題,確保業務查詢結果符合預期。