我正在為一個專案在 python 中創建一個資料庫介面,在該專案中我需要加密進入我的資料庫的所有內容并解密所有退出的專案。
不幸的是,我的一些字符被加密為 sql 中的元字符,這在從資料庫中選擇某些內容時會帶來麻煩。出現的第一件事是在 sqlite 中使用帶有“?”的準備好的陳述句。字符和引數化值,如下所示:
con = sqlite3.connect('database.db')
cursorObj = self.con.cursor()
sqlStatement = "SELECT * FROM usertable WHERE username LIKE '%' || ? || '%'"
self.cursorObj.execute(sqlStatement, ("_", ))
rows = self.cursorObj.fetchall()
問題是,使用此陳述句,我從資料庫中選擇所有行,而不是所有包含 '_' 的行。'%' 字符也是如此。我知道這些字符就像 SQL 的正則運算式,使用“_”可以選擇任何一個字符,使用“%”可以選擇任何一個或多個字符。我認為使用引數化值可以避免這些問題,并且可以自由地將任何字符放入引數化值的元組中,包括通配符,因為 sqlite 無論如何都應該注意轉義它們。
我的目標是只取回其中包含字面“_”和“%”的值,而不會在此程序中從資料庫中獲取任何不需要的行。我想避免上述邏輯之外的任何元字符檢查(即在特殊的“元字符檢查功能”中)
希望您的回答可以為我澄清這一點,因為我一直試圖弄清楚它有一段時間了,但我越看越卡。提前致謝 :-)。
- 編輯
在對此進行了更多測驗之后,似乎這個問題只在使用時出現LIKE ?,而不是與WHERE column = ?. 有了它,WHERE它實際上可以正確地逃脫它。
uj5u.com熱心網友回復:
LIKE您必須通過在搜索字串中添加用戶指定字符的前綴來轉義元字符。例如:
username LIKE '%' || ? || '%' ESCAPE '#'
然后確保您系結到該引數的字串中的每個下劃線和 %#前面都有一個。
在python中,您可以使用str.translate()將相關Unicode代碼點映射到字串的方法來完成該部分(包括轉義轉義字符以防出現):
>>> teststr='foo
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490815.html
