前言
最近在一次使用sql中的where in語(yǔ)句時(shí),造成了一些非預(yù)期的查詢結(jié)果。尤其是在代碼中去編寫并執(zhí)行sql語(yǔ)句時(shí),會(huì)出現(xiàn)一些意外情況。再查閱了一些資料以及手動(dòng)測(cè)試后,發(fā)現(xiàn)是自己sql語(yǔ)句寫法存在問題,在此記錄。
例子
業(yè)務(wù)需求,需要通過SQL語(yǔ)句從asset資產(chǎn)表中查詢域名字段在(“thief.one”,”nmask.cn”,”sec.thief.one”)范圍內(nèi)的數(shù)據(jù)庫(kù)記錄,SQL語(yǔ)句該怎么寫呢?
拼接法(錯(cuò)誤)
values = "'thief.one','nmask.cn','sec.thief.one'"
sql = "select * from asset where domain in ("+values+")"
print sql
說明:通過將搜索條件以字符串拼接的方式構(gòu)造sql語(yǔ)句,語(yǔ)法上可通過,但存在著安全隱患(參照sql注入漏洞)
參數(shù)化1(錯(cuò)誤)
values = (("thief.one","nmask.cn","sec.thief.one"),)
sql = "select * from asset where domain in %s"
print sql
print values
說明:通過參數(shù)化方式,將where in 后面的查詢內(nèi)容傳入。表面上看沒問題,但在編譯過程中,會(huì)將(“thief.one”,”nmask.cn”,”sec.thief.one”)整體看成一個(gè)字符串,而作為查詢條件,與需求不符合。
參數(shù)化2(正確)
values = ("thief.one","nmask.cn","sec.thief.one")
sql = "select * from asset where domain in ({})".format(",".join(['%s' for i in values]))
print sql
print values
說明:通過計(jì)算values里面字符串個(gè)數(shù),動(dòng)態(tài)構(gòu)造編譯的參數(shù)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- MySQL的WHERE語(yǔ)句中BETWEEN與IN的使用教程
- MySQL 存儲(chǔ)過程傳參數(shù)實(shí)現(xiàn)where id in(1,2,3,...)示例
- 解析sql語(yǔ)句中l(wèi)eft_join、inner_join中的on與where的區(qū)別