You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:09:03