Mysql的max()函式9大於10問題

ArGilgamesh發表於2024-05-14

前言

在公司老專案使用過程中都遇到過這個問題,所以這裡記錄下來

問題描述

使用系統中發現系統的字典新增之後排序不固定,於是查詢問題,開啟資料庫發現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`

相關文章