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

2021-10-03 10:16:18 字數 875 閱讀 6606

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 ...