列 server_id VARCHAR(2) 存數字 '1','2',...,'10',ORDER BY server_id DESC 產出字典序:
8, 7, 6, 5, 4, 3, 2, 10, 1 -- 錯誤:'10' < '2'
+0(最短但可讀性差)SELECT server_id FROM cardserver WHERE game_id=1 ORDER BY server_id+0 DESC LIMIT 10;
-- 結果:10, 8, 7, 6, 5, 4, 3, 2, 1
CAST(expr AS type)(標準 SQL,推薦)SELECT server_id FROM cardserver WHERE game_id=1
ORDER BY CAST(server_id AS SIGNED) DESC LIMIT 10;
CONVERT(expr, type)(MySQL 擴展,同等效果)SELECT server_id FROM cardserver WHERE game_id=1
ORDER BY CONVERT(server_id, SIGNED) DESC LIMIT 10;
| 類型 | 說明 |
|---|---|
BINARY[(N)] | 二進制字符串,按字節比較 |
CHAR[(N)] | 字符串,按字符集校驗規則比較 |
DATE | 日期 |
DATETIME | 日期時間 |
DECIMAL | 定點數 |
SIGNED [INTEGER] | 有符號整數 |
TIME | 時間 |
UNSIGNED [INTEGER] | 無符號整數 |
CAST(col AS SIGNED),語義清晰、標準兼容、易於 Code Review。ORDER BY varchar_col,考慮添加 CAST(varchar_col AS SIGNED) 函數索引(MySQL 8.0+ 支援)或冗餘一個數值列。