問(wèn)題背景:一條簡(jiǎn)單的select查詢語(yǔ)句,數(shù)據(jù)庫(kù)返回結(jié)果不正確,比方說(shuō)我查詢條件是 where A = a1,實(shí)際mysql的返回結(jié)果是a1,a2兩條都給返回了,詳見(jiàn)圖示。因?yàn)楸聿皇潜救私⒌?,所以定位這個(gè)問(wèn)題的時(shí)候走了點(diǎn)彎路。下面是詳細(xì)的分析過(guò)程。

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

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