1. 程式人生 > >Mysql where '字串' 條件細節

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.