MySQL ORDER BY 對數值與日期型別排序直覺正確,但對 VARCHAR 字串型別卻常出現「1、10、11、2、3」這類字典序亂序。本文針對「純數字字串」與「中文字串」兩大高頻場景,提供 +0 隱性轉型 與 CONVERT() 指定編碼 兩大核心技巧,並解析底層原理,讓排序結果完全符合業務預期。
直接 ORDER BY isdcode ASC 會依字元碼排序,導致 100 排在 20 前面。
ORDER BY (isdcode + 0) ASCSELECT * FROM gb_country_isdcode ORDER BY (isdcode + 0) ASC;
原理:MySQL 遇到字串與數值運算(+ 0),會嘗試將字串隱性轉型為數值(整數或浮點數),轉型後再比較大小,自然符合數值邏輯。

資料庫預設 utf8_general_ci 排序規則非拼音序。若直接修改欄位編碼為 gbk,會牽涉寫入、讀取、前端傳值全鏈路編碼地獄。
CONVERT() 指定 gbk 排序SELECT * FROM table_name ORDER BY CONVERT(column_name USING gbk);
優勢:不動表結構、不改儲存編碼、不影響寫入,僅在查詢瞬間以 gbk 字符集比較,即可獲得拼音序結果。
COLLATE 替代方案MySQL 8.0+ 可直接指定校對規則,更語意化:
-- 依拼音排序
ORDER BY column_name COLLATE utf8mb4_unicode_ci; -- 或特定拼音校對規則
但 CONVERT() 相容性更廣(支援 5.6+),且無需依賴特定校對規則是否安裝。
CAST(isdcode AS UNSIGNED) 代替 +0,雖同樣有效但語法較冗長。INT 以解決排序,會失去前導零、超長號碼等業務彈性。+0 若字串含非數字字元(如 '123abc'),轉型結果為 123,可能導致非預期分組,建議配合 WHERE isdcode REGEXP '^[0-9]+$' 過濾。掌握 +0 與 CONVERT(),VARCHAR 排序不再頭痛,數字按大小、中文按拼音,隨心所欲。