在做業務的時候遇到查詢的字段需要對varchar的字段進行排序,因爲這個字段是以前就已經生成的,但是所有的值都是數字,排序的結果和預期的數值大小排序不太一樣。
原因在於對於字符串的排序原理是按位(每個字符)進行比較的,並且是按照每個字符的ASCII碼值,包括數字(數字的ASCII值等於該數字的值)。
那麼如果這個字段全爲數字了,排序的結果就會與字段爲Int型的排序結果不一樣。
CREATE TABLE order_test (
id INT (11) PRIMARY KEY,
number VARCHAR (100)
);
以一些測試值爲例:12,11,10,1,21,22,5,9,100:
執行排序語句:
SELECT * FROM order_test a ORDER BY a.number;
排序後的結果爲:1,10,100,11,12,21,22,5,9
解決方法:
可以直接將對應的字段轉換爲int類型:
SELECT * FROM order_test a ORDER BY a.number+0;
兩個語句執行結果分別爲:
需要注意的是:這樣的處理方式只對數字有效,如果其中還包含字符,其結果不會影響數字的排序,但是也不會按照原有的按位的方式排序。