MySQL神奇where查詢條件 (已解決)

各位試一下查詢結果,會是全表查詢所有數據

#下面那是四個單引號,不是兩個雙引號
SELECT * FEOM table WHERE column = ''+''
#還有這句
SELECT * FEOM table WHERE column = '這句查詢'+'也很騷'

後續原因,繼續調查

分割線:




以下是老夫測試得出的結果

不帶列名搜索:
SELECT * FROM table WHERE ‘1試一試字符’ 全
SELECT * FROM table WHERE ‘試一試1字符’ 0
SELECT * FROM table WHERE ‘試一試字符1’ 0

SELECT * FROM table WHERE ‘0試一試字符’ 0
SELECT * FROM table WHERE ‘試一試0字符’ 0
SELECT * FROM table WHERE ‘試一試字符0’ 0

SELECT * FROM table WHERE ‘1試一試’+‘字符’ 全
SELECT * FROM table WHERE ‘試1一試’+‘字符’ 0
SELECT * FROM table WHERE ‘試一試1’+‘字符’ 0
SELECT * FROM table WHERE ‘試一試’+‘1字符’ 全
SELECT * FROM table WHERE ‘試一試’+‘字1符’ 0
SELECT * FROM table WHERE ‘試一試’+‘字符1’ 0

SELECT * FROM table WHERE ‘0試一試’+‘字符’ 0
SELECT * FROM table WHERE ‘試0一試’+‘字符’ 0
SELECT * FROM table WHERE ‘試一試0’+‘字符’ 0
SELECT * FROM table WHERE ‘試一試’+‘0字符’ 0
SELECT * FROM table WHERE ‘試一試’+‘字0符’ 0
SELECT * FROM table WHERE ‘試一試’+‘字符0’ 0

帶列名搜索:

SELECT * FROM table WHERE column = ‘1試一試’+‘字符’ 0
SELECT * FROM table WHERE column = ‘試1一試’+‘字符’ 全
SELECT * FROM table WHERE column = ‘試一試1’+‘字符’ 全
SELECT * FROM table WHERE column = ‘試一試’+‘1字符’ 0
SELECT * FROM table WHERE column = ‘試一試’+‘字1符’ 全
SELECT * FROM table WHERE column = ‘試一試’+‘字符1’ 全

SELECT * FROM table WHERE column = ‘0試一試’+‘字符’ 全
SELECT * FROM table WHERE column = ‘試0一試’+‘字符’ 全
SELECT * FROM table WHERE column = ‘試一試0’+‘字符’ 全
SELECT * FROM table WHERE column = ‘試一試’+‘0字符’ 全
SELECT * FROM table WHERE column = ‘試一試’+‘字0符’ 全
SELECT * FROM table WHERE column = ‘試一試’+‘字符0’ 全

網上搜到的一些幫助:
分析器先找到關鍵字SELECT,然後跳到FROM關鍵字將column表導入內存,並通過指針p1找到第一條記錄,接着找到WHERE關鍵字計算它的條件表達式,如果爲真那麼把這條記錄裝到一個虛表當中,p1再指向下一條記錄。如果爲假那麼p1直接指向下一條記錄,而不進行其它操作。一直檢索完整個表,並把虛表返回給用戶。

實際上在執行where 條件的時候 無論where後面的整體是什麼,最後的結果都強轉成了數字(強轉規則就是下面的) 然後通過轉的數字跟0作爲比較,如果是等於0則結果爲0 即false ,如果不爲0 結果爲1 即true ,所以 where 的是true 還是 false

方法一:SELECT CAST(‘123’ AS SIGNED);
方法二:SELECT CONVERT(‘123’,SIGNED);
方法三:SELECT ‘123’+0;
where後的條件,最終是以數字的形式進行比較,換言之where後的條件,最終生成的結果都是數字,所以要發生字符串向數字的轉換(SIGNED是int的意思)

//這句話存疑
換句話說,如果字符串無法直接轉換成數字,則字符串會進行前置數字正則匹配,成爲最終的結果。

持續更新中…
同時期待MySQL大神前來解答

分割線




大概過了一週了吧,上面幾條語句經過思考其實可以分爲四種:

不帶列名搜索:
SELECT * FROM table WHERE 1 全表
SELECT * FROM table WHERE 0 無數據
帶列名搜索:
SELECT * FROM table WHERE column = 1 無數據
SELECT * FROM table WHERE column = 0 全表

其中的
SELECT * FROM table WHERE 1
這語句可以再變形,即
SELECT * FROM table WHERE 1 = 1
所以查到的是所有數據。

SELECT * FROM table WHERE 0
這句不言而喻,查到的是空

而帶列名搜索
SELECT * FROM table WHERE column = 1
SELECT * FROM table WHERE column = 0

stack overflow中記錄有

Question :SELECT * FROM table WHERE email=0 returned all rows from the table.
 
Solution: This is because it is converting the email field (which I assume is a varchar
field) to an integer. Any field without a valid integer will equate to 0. You should make 
sure that you only compare string fields to string values (same goes for dates, comparing 
to dates). The query should be as follows.
 
SELECT * FROM table WHERE email='0';

意思就是 mysql會自動將列(varchar格式)轉化爲integer ,並且等於0

而我所用的確實是字符串列,上面沒有註明確實比較失誤
而我所用的確實是字符串列,上面沒有註明確實比較失誤
而我所用的確實是字符串列,上面沒有註明確實比較失誤

所有字符串列帶列名搜索可轉化爲
SELECT * FROM table WHERE 0 = 1
SELECT * FROM table WHERE 0 = 0
第二句爲真,所以查到的是全表數據。

到此,問題解決

那麼最開始的查詢語句

SELECT * FEOM table WHERE num = ''+''
SELECT * FEOM table WHERE num = '這句查詢'+'也很騷'

其實都是相當於
SELECT * FROM table WHERE column = 0,即
SELECT * FROM table WHERE 0 = 0

上面有一句話

**如果字符串無法直接轉換成數字,則字符串會進行前置數字正則匹配,成爲最終的結果。**

可以解釋以下SQL
SELECT * FROM table WHERE column = ‘0試一試’+‘字符’ 全
相當於
SELECT * FROM table WHERE column = ‘試一試’+‘0字符’ 全(後面這個字符串句首是0,mysql也執行了前置數字正則匹配)
相當於
SELECT * FROM table WHERE column = 0

SELECT * FROM table WHERE 0 = 0

SELECT * FROM table WHERE 1 = 1


SELECT * FROM table WHERE column = ‘1試一試’+‘字符’ 0
相當於
SELECT * FROM table WHERE column = ‘試一試’+‘1字符’ 0(後面這個字符串句首是1,mysql也執行了前置數字正則匹配)
相當於
SELECT * FROM table WHERE column = 1

SELECT * FROM table WHERE 1 = 1

分割線


SELECT * FROM table WHERE column = ‘試1一試’+‘字符’ 全
因爲數字不在字符串第一位,所以轉化之後字符串is converting the email field (which I assume is a varchar
field) to an integer. Any field without a valid integer will equate to 0
相當於
SELECT * FROM table WHERE column = 0
以此類推,舉一反三。

至此,解答了所有疑問,感謝各位愛分享的小夥伴。

尤其是這個小夥伴 https://blog.csdn.net/xaioAdmin/article/details/85614419

感謝追求真理的我們,感謝開發程序的人員,感謝父母,感謝國家。

感謝創造這個世界的模擬器(姑且稱之爲模擬器吧),感謝創造這個系統的造物主(姑且稱之爲造物主吧)。感謝產生我這段代碼,讓我感受到美好與苦痛。
希望有一天我或者某人可以令世界大同,大批天下寒士俱歡顏,讓每一段代碼都快樂幸福。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章