【问题标题】:Escape a '%' in a mySQL query being executed via python with LIKE and % wildcards使用 LIKE 和 % 通配符在通过 python 执行的 mySQL 查询中转义“%”
【发布时间】:2018-08-02 19:29:39
【问题描述】:

我正在尝试通过 LIKE 运算符匹配带有 '%' 的字符串,但由于格式混乱,这给了我一个 python TypeError

例子:

SELECT *
FROM table
WHERE name LIKE "%exam\%ple%"

在 python 中,由于转义了 LIKE 通配符,查询看起来像这样

match = "%%exam\\%ple%%"

query = """
SELECT *
FROM table
WHERE name LIKE "%s"
""" % (match)

然而这仍然给我同样的错误。

如何在 python 中编写查询来搜索table,其中name 匹配"exam%ple" 的所有实例?

【问题讨论】:

  • 你能分享你的python代码吗?
  • @Mureinik 更新见上面的编辑
  • 根据docs,您可以为通配符指定一个备用转义。所以你可以做name LIKE '%exam|%ple%' ESCAPE '|'
  • 你不能使用 conn.escape_string() 吗?

标签: python mysql escaping wildcard


【解决方案1】:

您不需要转义查询生成中 % 右侧的字符串中的 % 实例,因此:

match = r"%exam\%ple%"  # Use r string to avoid having to double \s
query = """
SELECT *
FROM table
WHERE name LIKE "%s"
""" % (match)
print(query)  # as a check

结果:

SELECT *
FROM table 
WHERE name LIKE "%exam\%ple%"

还请注意,您可以有效地转义,即通过将它们加倍来制作文字 % 字符,即 %d = 插入数字但 %%d = 插入 "%d" 但是您需要为每个 % 操作加倍表演。

更好的选择是使用字符串format 命令,该命令在 python 3.4+ 任何 python 2.7 中都可用。这使用 {} 作为插入点的标记(它被归类为迷你语言),并且不会触及您的 % 符号。

In [2]: "{} == {}".format(1,2)
Out[2]: '1 == 2'

In [3]: match = r"%exam\%ple%"  # Use r string to avoid having to double \s

In [4]: query = """
   ...: SELECT *
   ...: FROM table
   ...: WHERE name LIKE "{}"
   ...: """.format(match)

In [5]: print(query)

SELECT *
FROM table
WHERE name LIKE "%exam\%ple%"

【讨论】:

  • 在mySQL中这是有效的,但是python抛出错误TypeError: not enough arguments for format string',它将转义%视为格式字符串变量。
  • 您可以有效地转义,即通过将它们加倍来制作文字 % 字符,即 %d = 插入数字但 %%d = 插入 "%d"
  • 我已经尝试过了,但是当我通过在 %% 子句中执行 %% 来逃避 % 时,查询最终会搜索 tes%%t 之类的东西,而不是 @987654331 @
  • @nyvokub 您只需将需要保留在 % 运算符左侧的字符串中的 %s 加倍,即“金额为 %d%%” % (22.5,) 或"金额是 %s" % ("22.5%", ),如果你明白我的意思的话。
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多