前言
最近在一次使用sql中的where in語句時,造成了一些非預期的查詢結果。尤其是在**中去編寫並執行sql語句時,會出現一些意外情況。再查閱了一些資料以及手動測試後,發現是自己sql語句寫法存在問題,在此記錄。
例子業務需求,需要通過sql語句從asset資產表中查詢域名字段在(「thief.one」,」nmask.cn」,」sec.thief.one」)範圍內的資料庫記錄,sql語句該怎麼寫呢?
拼接法(錯誤)
values = "'thief.one','nmask.cn','sec.thief.one'"
sql = "select * from asset where domain in ("+values+")"
print sql
說明:通過將搜尋條件以字串拼接的方式構造sql語句,語法上可通過,但存在著安全隱患(參照sql注入漏洞)
引數化1(錯誤)
values = (("thief.one","nmask.cn","sec.thief.one"),)
sql = "select * from asset where domain in %s"
print sql
print 程式設計客棧vawww.cppcns.comlues
說明:通過引數化方式,將where in 後面的查詢內容傳入。表面上看沒問題,但在編譯過程中,會將(「thief.one」,」程式設計客棧nmask.cn」,」sec.thief.one」)整體看成乙個字串,而作為查詢條件,與需求不符合。
引數化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
說明:通過計算values裡面字串個數,動態構造編譯的引數。
總結本文標題: sql where in引數化編譯寫法簡單示例
本文位址: /shujuku/shujukuqita/286822.html
mysql 編譯引數 MYSQL 編譯引數
mysql 編譯引數 prefix opt mysql 將mysql安裝到目錄 opt mysql下 with charset utf8 指定預設字符集為utf8 with extra charsets all 將mysql所有支援的字符集編譯進來 with tcp port 3306 指定此mys...
gcc編譯引數
gcc編譯引數 linux寶庫 gcc引數詳解 介紹 gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的...
linux gcc編譯引數
gcc 編譯 hello.c hello.i 預處理階段,生成中間檔案 hello.s 彙編階段,生成彙編檔案 hello.o 編譯階段,生成二進位制 檔案 hello 鏈結階段,生成可執行程式 預處理階段,主要是將巨集定義替換,條件編譯 標頭檔案包含,可以cat hello.i檔案檢視 gcc e...