我們不妨先來看一個現象
select cast(1/5 as decimal(4,2));
我們先盲猜一下這條SQL的運行結果,如果按照我們的一貫經驗,那應該是
0.20
,畢竟我們as decimal(4,2)
是保留兩位小數的。但是實際上並不一定是。
在不同的mysql版本下執行了這條sql:
select cast(1/5 as decimal(4,2)) as res,version() as v;
得到的結果如下:
5.6.45
、5.6.36
、5.6.39
三個小版本中的表現,不論是cast
還是truncate
函數,對能整除的操作的保留兩位小數
得到的結果都是無法保留末尾是0
的小數的,末尾的0
會自動被捨棄。
5.7.22
、8.0.15
這兩個版本表現完全是另一種結果,執行以下SQL:
select cast(1/5 as decimal(4,2)) as castRes,truncate(1/5,2) as truncateRes;
得到的結果都是0.20
。
某次開發過程中遇到了這個Bug,不得其解,記錄一下,以示後來人。不過我們也由此得出一個準則,數據格式的format
處理還是
儘可能的交給程序去處理,而不是mysql。