【问题标题】:Why Oracle doesn't escape double backslashes to single?为什么 Oracle 不将双反斜杠转义为单反斜杠?
【发布时间】:2021-11-16 00:54:39
【问题描述】:

我使用双反斜杠将 SQL 查询从 python 服务器传递到 Oracle:

SELECT
   ID
FROM
   Works
WHERE
   NAME IN ('ABC\\ABC', 'sdf\\sdfsdf', 'lkj\\sdfsdf')

查询执行后我什么也没得到。但是当删除一个反斜杠并在DBeaver(SQL Tool)中执行时,结果是OK的。

表中的NAME 字段有一个反斜杠,如下所示:ABC\ABC

【问题讨论】:

  • 'ABC\\ABC' - 这是文字值,句点。 Oracle 不会对它做任何事情。您需要将其发送到 oracle 之前准备好您的值。 phyton 有[string].replace("\\", "\")。使用它。
  • @T.S. python 总是在变量中存储双反斜杠以在打印等时对其进行转义。所以replace 和编码/解码在这种情况下不起作用。

标签: python sql oracle dbeaver


【解决方案1】:

反斜杠不是 Oracle 字符串文字中的特殊字符,因此,您无需使用另一个反斜杠对其进行转义。

您需要转义的一件事是通过将单引号加倍(假设您没有使用“q”语法)来转义,因此您将有一个类似 'Susan''s' 的字符串

【讨论】:

    【解决方案2】:

    我的问题有两种解决方案:

    1. 在 Python 中的 SQL 查询中绑定值:

      https://cx-oracle.readthedocs.io/en/latest/user_guide/bind.html#binding-multiple-values-to-a-sql-where-in-clause;

      感谢Christopher Jonesexecute 命令中绑定值的解决方案。它适用于双反斜杠。

       cursor.execute("""
           select employee_id, first_name, last_name
           from employees
           where last_name in (:name1, :name2)""",
           name1="Smith", name2="Taylor")
      
    2. 播放解码/编码:how do I .decode('string-escape') in Python3?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 2013-04-15
      • 2017-07-25
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 2010-12-14
      相关资源
      最近更新 更多