id
name
score1小紅
802小藍50
3馬里奧
1004
路易150
這張表中,由於某些不可抗力的影響,name和score都是用的varchar型別。
這時有乙個需求,需要把所有的學生按照成績由高到低排序。正常的想法應該是這樣來寫:
錯誤的寫法
select * from student order by score desc
看上去好像沒什麼問題,但發現得到的結果為:
idname
score1小紅
802小藍504路易
1503
馬里奧100
並不是我們想要的結果,小紅只有80分卻排在第一位,是為什麼呢。
原因也很簡單,varchar型別對數字進行排序,是從第一位開始每一位依次比較來進行排序的。也就是說,四位學生第一位,最大的數字是小紅的8,所以小紅排在第一位,第二大的是小藍的5,所以小藍排第二,路易和馬里奧第一位都是1,但路易第二位是5,馬里奧的第二位是0,所以路易排在馬里奧的前面。
正確的寫法
剛解釋了普通排序錯誤的原因,現在說一下正確的寫法。
select * from student order by convert
(score,signed) desc
這裡使用了乙個函式convert(score,signed),實現的功能是把score欄位轉化為int型別再進行排序,這樣得到的就是正確的結果了:
idname
score4路易
1503
馬里奧1001小紅
802小藍50
可以看到,得到的結果,是按分數由大到小的順序來進行排序的。
MySQL中varchar 和char型別介紹
varchar 和char型別是兩種最重要的字串型別,在儲存引擎是innodb或myisam下,討論varchar和char。一 varchar型別 varchar 用於可變長字串,是最常見的字串資料型別。它比定長型別更節省空間,按照儲存的實際字串長度分配空間。varchar需使用1或2個額外位元組...
MySQL中對varchar型別排序問題
在今天開發時碰到了這樣的乙個問題 在資料庫表中有乙個對varchar型別的數值進行desc排序,很簡單的要求吧。可是奇怪的現象出現了。表中的資料不會根據從高到底進行排序了。瞬間有點淚奔的感覺呀。還好經過高手指點啊。所以想和大家分享一下。希望下乙個mysql初學者以後不要像我一樣了啊。還是廢話少說,看...
mysql中得到varchar型別資料的最大值
如果不轉的話查詢的會有問題 select max cast userno as signed integer from userinfo 或者select max cast userno as unsigned integer from userinfo varchar 轉 int cast id ...