1. 程式人生 > >Mysql精度損失--隱式型別轉換的坑

Mysql精度損失--隱式型別轉換的坑

    今天在工作中遇到一個小問題,很不起眼的問題,但是很嚴重.就是mysql精度損失.

   為什麼我們在進行mysql操作的時候要加引號呢?通常都是字串需要加引號,而數字就不需要加引號,但是這次我在純數字的字串中沒有加引號,所以問題就出現.

     contract是varchar型別,長度為64

SELECT * FROM contractinfo WHERE contract = 51010201607291499

結果:


可以看到查詢到了兩條結果,本來純字串是可以不加引號的,但是這是在mysql未發生精度損失的前提下,mysql會自動對sql語句進行優化,會將contract值優化為float型別,而float型別由於精度問題導致查詢出來了兩條記錄.

同樣的情況也會發生在修改資料時.

UPDATE contractinfo SET purchaseFee=100000.0 WHERE contract = 51010201607291499 AND balanceOfAccount = 0

結果:


這下問題就很大了!

下面是官方文件給出的解釋,有興趣的童鞋可以看看,當值為字串時一定要記得加引號!