mysql中varchar類型存入數字時排序問題

學生成績表

id name score
1 小紅 80
2 小藍 50
3 馬里奧 100
4 路易 150

這張表中,由於某些不可抗力的影響,name和score都是用的varchar類型。
這時有一個需求,需要把所有的學生按照成績由高到低排序。正常的想法應該是這樣來寫:

錯誤的寫法

select * from student order by score desc

看上去好像沒什麼問題,但發現得到的結果爲:

id name score
1 小紅 80
2 小藍 50
4 路易 150
3 馬里奧 100

並不是我們想要的結果,小紅只有80分卻排在第一位,是爲什麼呢。
原因也很簡單,varchar類型對數字進行排序,是從第一位開始每一位依次比較來進行排序的。也就是說,四位學生第一位,最大的數字是小紅的8,所以小紅排在第一位,第二大的是小藍的5,所以小藍排第二,路易和馬里奧第一位都是1,但路易第二位是5,馬里奧的第二位是0,所以路易排在馬里奧的前面。

正確的寫法

剛解釋了普通排序錯誤的原因,現在說一下正確的寫法。

select * from student order by CONVERT(score,SIGNED) desc

這裏使用了一個函數CONVERT(score,SIGNED),實現的功能是把score字段轉化爲int類型再進行排序,這樣得到的就是正確的結果了:

id name score
4 路易 150
3 馬里奧 100
1 小紅 80
2 小藍 50

可以看到,得到的結果,是按分數由大到小的順序來進行排序的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章