today,測試同學反映某某查詢功能出現問題,沒有配置的數據還是查詢出來了,翻閱代碼進行查看,抽取出查詢的sql,進行客戶端查詢發現確實有沒有關聯的數據還是查詢出來了,排查了好久定位到,是關聯的字段類型不匹配導致的原因。
解決方式:使用mysql的cast函數,例如下面圖片中的改法即可解決。
好了知道解決方案了,講解下原因以及場景,方便同學們針對自己的情況作出分析。
首先創建2張表:
在我圈起來的地方一會要跟一張水果表進行關聯
這2張表中的圈起來的部分進行關聯查詢,可以看到一個是 int(11) 一個是 varchar(64) 類型,2種不同類型進行關聯會產生什麼情況呢?接下來我們繼續說明。
列舉出2個表的數據:
goods表:
orange表:
看到兩張表的數據了,接下來我需要 goods 表的 id 字段與orange 表的 goods_type 字段進行關聯,看懂的同學應該能知道,理論上關聯之後查出來的數據一定是下面這個樣子的:
但是在我們執行了,下面的sql語句之後產生了什麼數據呢?
sql語句如下:
select g.name as goods_name ,o.goods_type,o.name
from goods g inner join orange o on g.id = o.goods_type
where g.type = 1
查詢出來的數據如下:
誒?居然查詢出了一個goods_type 是 1ad...(反正是小T瞎編的),這不應該啊。是的啊,起初碰到這個bug的時候我也是這麼想的,後來多方查詢知道,mysql在做不同類型字段關聯的時候,會把字段轉成相同類型比較,可能就會導致這種沒有關聯的數據出現。
所以,碰到上面這種問題的同學,參照本帖開篇所說的情況進行解決。
但是千萬切記,做表關聯的時候,關聯字段一定要是相同字段,因爲如果做大數據量連表查詢的時候,本就因爲連表導致的查詢效率降低,如果字段類型不同,同時還會導致mysql會不停的進行轉換類型比較,這樣的話,可能會導致查詢效率降低,無限堆積的慢查詢sql可是會使系統整體出現問題的。