如何编写可匹配单引号与双引号的SQL LIKE语句?
解决包含特殊字符的SQL LIKE查询问题
原代码直接用f-string拼接SQL语句,当加密后的字符串包含单引号时,会直接破坏SQL语法结构,同时存在SQL注入风险,正确的处理方式如下:
优先方案:使用参数化查询
这是最安全、最可靠的做法,不同Python数据库驱动的参数占位符略有差异,示例如下:
SQLite3 示例
encryptedaName = encrypt(pName) # 用?作为占位符 sql = "SELECT * FROM laptop WHERE Name LIKE ?" # 将通配符和加密字符串拼接后作为参数传入 cursor.execute(sql, ('%' + encryptedaName + '%',))
PyMySQL(MySQL)示例
encryptedaName = encrypt(pName) # 用%s作为占位符 sql = "SELECT * FROM laptop WHERE Name LIKE %s" cursor.execute(sql, ('%' + encryptedaName + '%',))
参数化查询会自动处理字符串中的单引号、双引号等特殊字符,同时彻底避免SQL注入问题,是推荐的标准写法。
不推荐的手动转义方式
如果因特殊场景必须手动拼接SQL,需要将字符串中的单引号替换为两个单引号(SQL语法中用两个单引号表示一个单引号):
encryptedaName = encrypt(pName).replace("'", "''") sql = f"SELECT * FROM laptop WHERE Name LIKE '%{encryptedaName}%'"
这种方式容易遗漏其他特殊字符的处理,且无法防范SQL注入,仅作应急参考,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Msama
相关产品推荐
相关产品推荐

