为什么Oracle不会将双反斜杠转义为单反斜杠?
Python连接Oracle查询带反斜杠字段无结果问题解决
问题原因
这个问题是两层转义规则叠加导致的:
- Python普通字符串中,反斜杠
\是转义字符,你在代码中写的两个反斜杠\\,会被Python解析为1个反斜杠 - 如果你使用字符串拼接/格式化的方式手动构造SQL,大部分Oracle数据库驱动会对传入的SQL语句中的特殊字符做二次转义,这时候Python解析得到的1个反斜杠,会被驱动再次转义为2个反斜杠,最终Oracle实际执行的查询条件是
'ABC\\ABC',和表中存储的'ABC\ABC'无法匹配,因此返回空结果。
你在DBeaver中直接执行删除一个反斜杠的SQL时,没有额外的转义层,SQL直接发送给Oracle执行,条件和存储值一致,因此可以正常返回结果。
解决方案
最优方案:使用参数化查询(推荐)
不要手动拼接SQL字符串,使用数据库驱动支持的参数化查询能力,由驱动自动处理转义逻辑,既可以避免转义冲突,还能防范SQL注入风险。
以Python常用的cx_Oracle驱动为例,写法如下:
import cx_Oracle # 建立数据库连接 conn = cx_Oracle.connect("用户名/密码@主机地址:端口/服务名") cursor = conn.cursor() # 直接传入原始的目标值,不需要额外转义 target_names = ["ABC\\ABC", "sdf\\sdfsdf", "lkj\\sdfsdf"] # 构造IN查询的参数占位符 placeholders = ", ".join([f":param_{i}" for i in range(len(target_names))]) sql = f"SELECT ID FROM Works WHERE NAME IN ({placeholders})" # 执行查询时传入参数列表 cursor.execute(sql, target_names) result = cursor.fetchall()
临时方案:手动匹配转义层数(不推荐)
如果必须手动拼接SQL,可以根据驱动的转义规则增加反斜杠数量,比如驱动会做1次转义的场景下,你需要在Python字符串中写4个反斜杠,才能保证最终到达Oracle的是1个反斜杠:
# Python代码中写4个反斜杠 sql = "SELECT ID FROM Works WHERE NAME IN ('ABC\\\\ABC', 'sdf\\\\sdfsdf', 'lkj\\\\sdfsdf')"
该方案兼容性差,不同驱动、不同运行环境的转义规则可能存在差异,仅可用于临时测试。
内容的提问来源于stack exchange,提问作者Shalamnik
相关产品推荐
相关产品推荐

