問題背景:一條簡單的select查詢語句,數據庫返回結果不正確,比方說我查詢條件是 where A = a1,實際mysql的返回結果是a1,a2兩條都給返回了,詳見圖示。因為表不是本人建立的,所以定位這個問題的時候走了點彎路。下面是詳細的分析過程。

分析過程:1.看起來查詢條件數字很長,首先懷疑是不是數據超過了bigint的最大值,導致數據被截?。ìF(xiàn)在想想挺傻的,明明存數據已經成功)
? ? ? ? ? ? ? ? ? ?2.想起來看看id列的數據類型,查看完發(fā)現(xiàn)是varchar,額,大概發(fā)現(xiàn)了問題,那在查詢條件上加單引號試試,結果返回一條,且結果是正確的。問題解決,但是原因還要進一步探究。

3.進一步聯(lián)想,這個類型不匹配的查詢條件,數據庫是怎么處理的呢,經過查詢相關資料,得出以下結論。
????a.在字符串和數值作比較的時候,字符串和數值都會轉換成浮點數進行比較。
? ? b.字符串在轉浮點數時,如果字符串開頭是數字,那就一直截取,直到截取到的不是數字是其他字符為止。若開頭不是數字,那么轉換數值類型的結果就直接取0。(如’123abc’轉成的值是123,'ab123’取到的值是0)
? ? c.在上述中,我的字符串存儲的是19位varchar類型。由于在轉換成浮點數的時候,數值太大會自動轉換成科學計數法,而且浮點數的精度不準確,都是取近似值,所以會出現(xiàn)意外的內容。也就是說我的查詢sql條件在用數值類型時,由于數值太大了,所以在轉換成浮點數的時候變成了科學計數法,同理被查詢的字段也被轉換成了浮點數的科學計數法,又由于浮點數精度的不準確,導致查詢結果出現(xiàn)不準確。
d.如果用了字符串字段,在查詢的時候最好不要用數值(如整數之類的)來查詢,因為如果用數值查詢,也就是如上面說的,MySql會自動把表達式中的值都轉換成浮點數。而這里索引字段varchar類型進行自動轉換成了浮點數,導致了索引失效。
參考:https://blog.csdn.net/weixin_43606226/article/details/105994535