項目中遇到的問題,一個筆試試卷成績查詢最高分和最低分,簡單的對分數字段排序,一直是正常的。
出bug了
就這個簡單的功能,突然有一天,客戶發現很奇怪的是最高分比最低分還低。
mysql有varchar2嗎?這明顯是有問題的:
數據庫大概是這樣的: id name score 1 小明 32
2 小紅 8
3 小王 40
MySQL substring。4 小武 16
直接排序:
SELECT * FROM `exam_score` ORDER BY score DESC;
輸出結果: id name score 2 小紅 8
sql字符串轉換為數字排序。3 小王 40
1 小明 32
4 小武 16
一個存儲成績的表的分數score字段原本為int類型被修改為varchar類型后,原本正常的最高分最低分輸出,變得不正確了。
MySQL decimal,原因
回溯找原因,原來這個score字段在當初是int字段,后來又一次小伙伴在筆試題庫里加入了0.5分值的題目,為了兼容這個情況,很粗暴的把成績字段也直接改為了varchar類型,而這個根據score字段排序的代碼沒有一起修改,那遇到這種情況,如何能正確的排序呢?
正確的使用varchar字段里的數字排序:
借助函數CONVERT(value as type),其中的type可選有如下幾種類型,按需使用: DECIMAL:浮點數
mysql 命令 添加字段,SIGNED:整數
UNSIGNED:無符號整數
由于這里score可能出現小數,所以應該選用DECIMAL。 SELECT * FROM `exam_score` ORDER BY CONVERT(score,DECIMAL) DESC;
將字段轉化為DECIMAL類型再排序,這樣就可以了。
mysql和oracle的區別,mysql存儲小數更好的辦法
這個問題其實是使用mysql存儲小數的問題,直接使用字符串執行效率會降低,推薦方案: 使用乘以10的倍數來存儲,比如價格以分(0.01元)為單位,乘以100后使用整數存儲,不會丟失精度,也不會出現類似的排序問題。
使用decimal類型的方式存儲。
將小數和整數部分分開存儲。
mysql 字段類型?參考
MySql遇到varchar字段數字字符串排序問題
更多精彩,敬請關注本博微信公眾號:hsu1943
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态