在公司老專案使用過程中都遇到過這個問題,所以這裡記錄下來
問題描述
使用系統中發現系統的字典新增之後排序不固定,於是查詢問題,開啟資料庫發現sort大部分都是"10"
mybatis中查詢語句如下:
`select IFNULL(MAX(DIC_SORT),0) FROM DIC_INFO WHERE 'ProjectId' =#{ProjectId}`
發現該語句查出來的數值為 “9”
原因分析
原因是因為,字串擷取函式擷取出來的數字是 varchar
型別的。而 max
函式對於字串的比較,是先比較首字元的 ASCii 碼
的大小,然後依次往後進行比較的,所以字串 9
比 字串 10
大。
解決辦法
所以如果想返回自然順序的最大值,需要把型別轉換為 int
後再比較。
替換函式:cast(xxx as UNSIGNED INTEGER)
Sql如下:
`select IFNULL(cast(MAX(DIC_SORT)),0) FROM DIC_INFO WHERE 'ProjectId' =#{ProjectId}`
這裡的 UNSIGNED INTEGER 可以為:
`浮點數 : DECIMAL`
`整數 : SIGNED INTEGER 等同於 INTEGER`
`無符號整數 : UNSIGNED INTEGER`
`二進位制,同帶 binary 字首的效果 : BINARY
字元型,可帶引數 : CHAR()
日期 : DATE
時間: TIME
日期時間型 : DATETIME`