【mysql】當where后接字符串,查詢時會發生什么?


好久沒有研究一個“深層次”的問題了。

首先來看我們為什么要討論這個問題~

首先這是一個正常的數據庫查詢,我們可以看到在ruizhi數據庫里的chouka表內,所有數據如圖。

現在,我們運行查詢:

select * from chouka where "qq=915620310";

select * from chouka where "1qq=915620310";

我們來看看結果:

可以看到,第一句結果為空,第二句結果為全查。兩句的差別在於,第二句的“”內,在第一句“”內的內容前加了一個1.

為什么會出現這種情況呢?

mysql在把字符串強轉成數字有三種方式:

方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123',SIGNED);
方法三:SELECT '123'+0;

where后的條件,最終是以數字的形式進行比較,換言之where后的條件,最終生成的結果都是數字,所以要發生字符串向數字的轉換,轉換規則如上。

換句話說,如果字符串無法直接轉換成數字,則字符串會進行前置數字正則匹配,成為最終的結果。我們來看看演示:

 

好了,現在你應該明白如果where后跟的是字符串,那么判定條件究竟會發生如何的變化。

我們為什么要探究這個問題呢?這是因為,在一些開發框架中,為了防止參數惡意注入,會對所有注入的參數“轉化成字符串”,這時候,應該尤其注意這個規則,以避免出現全查/空集的情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM