Mysql where '字串' 條件細節
今天小山(本文作者,後面我就這樣稱呼自己了)在群裡遇見一個哥們問一個sql問題(為什麼where 條件看起來沒生效),無論帖子還是論壇並沒有詳細的介紹,那麼小山跟大家來詳細剖析一下這個問題 juhao
本文針對: select * from table where '字串' ; 情況是細節分析, 解決 where '字串' 情況的原理判斷。
著急解決問題的直接看三、4.謎底總結 但我還是特別希望咱們一起走進謎團,順著思路,慢慢品學,記憶更深刻~
一、場景敘(lao)述(dao):
起因:(群裡看到問題了)
大圖瞭解一下:
(順便吐槽下,這csdn的水印神的扎心!還有,我可能寫程式碼寫的有點模糊了,圖還有點看不清);
這就是群里老哥的問題了:為什麼寫了一個 select * from rgwcus where 1=1 AND cusoo4='D' ; 這個sql 執行的效果的是全查
'where' 條件沒有生效..
二、針對找(tiao)錯(cier):
這個老哥是誰叫啥我也不曉得,qq群暱稱還有個'樂'字沒馬賽克就叫 樂樂 吧.畢竟是可能是40歲的大佬 名字也很貼切的.
接下可能有一部分人沒用過springJPA可以跳過(跳過這一段也不影響的,跳過的不要擔心,也可以硬著頭皮看,畢竟知道自己不會也是多知道了一件事)
===============================>可跳過分割線_開始<==================================
首先,樂樂應該是應用了jpa(沒用過的點飛機票) 再通過應用書寫原生sql的形式來完成查詢資料的操作.
因為 這裡用到了 where ? 的形式來注入引數 那麼對於jpa在引數注入情況呢 對於注入的引數都都統一識別為字字串,換個說法可以說 只有字串才可以唄注入引數中。
也就是說實際上 樂樂 預計執行的sql : select * from rgwcus where 1=1 AND cusoo4='D' 實際上 執行的是 :select * from rgwcus where "1=1 AND cusoo4='D'" 注意:紅色的雙引號
===============================>可跳過分割線_結束<==================================
上面就是說 樂樂 老哥呀在應用框架上呢 誤操作 , 把預計執行的sql : select * from rgwcus where 1=1 AND cusoo4='D' 實際執行成 select * from rgwcus where "1=1 AND cusoo4='D'" 是這個樣子的(區別注意where 後面是有雙引號的,小山用紅色來標記了)
三、sql 語句 where '字串' :
問題來了,我們大家所認知的,sql語句後面直接跟字串不會報錯嗎? 不管會不會報錯 可能開發了 幾年的老哥們都沒有直接去嘗試過,今天就小山就帶著大家一起來試試
插嘴: 慢慢來,小山發現自己有點嘮叨了,但是一點一點跟著小山進入謎團,無論是問題還是程式設計興趣,看見結果的時候都值得了(這水印真的是...$%^&&^&*^!!!)
嘗試:
1.首先隨便選個有點資料的表,然後場景還原:
結果是真的全查出來了 ??? 神奇的阿拉蕾啊
2.接下來我們試試多種嘗試:
難道是以為只有字串寫了 A=A 就能成嗎?試試去!
顯然不是!
沒有等於的關係呢? 試試!
顯然也不是!
3.小(mai)提(guan)示(zi):
看到這應該有一部分應該是關了網頁走了(應該很多人已經明白了),下面我就開始解開謎底
4.謎(fei)底(hua)總結:
這之前我們必須知道一個概念要不聊不下去,這不是嘮叨!正氣凌然!
mysql在把字串強轉成數字有三種方式:
方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123',SIGNED);
方法三:SELECT '123'+0;
那麼針對字串不滿足數字正則的字串mysql會取最前面滿足數字正則的獲取,聽不懂舉例:
應用方法三演示:
知道這個概念之後....看懂了也別關瀏覽器撒,尊重一下擼碼的自閉患者嘛.
真.謎底!
實際上在執行where 條件的時候 無論where後面的整體是什麼,最後的結果都強轉成了數字(強轉規則就是上面的) 然後通過轉的數字跟0作為比較,如果是等於0則結果為0 即false ,如果不為0 結果為1 即true ,所以 where 的是true 還是 false 你還不明白嗎?!
如果喜歡我的嘮叨,記得關注小山,如果不喜歡....不喜歡你也不能看到這了,加油程式設計師,你可真是個小機靈鬼呀!
不懂的直接問!這個咱不廢話
juhao.