Skip to main content
 首页 » 编程设计

python之"ValueError: Unsupported format character ' "' (0x22) 在...”在 Python/字符串

2025年05月04日26thcjp

我见过几个类似的线程,但尝试转义字符对我不起作用。

简而言之,我有一个字符串列表,我正在对其进行迭代,因此我的目标是构建一个查询,将列表中的许多字符串合并到“选择,喜欢”查询中。

这是我的代码(Python)

def myfunc(self, cursor, var_list): 
   query = "Select var FROM tble_tble WHERE" 
   substring = [] 
   length = len(var_list) 
   iter = length 
 
   for var in var_list: 
      if (iter != length): 
         substring.append(" OR tble_tble.var LIKE %'%s'%" % var) 
      else: 
         substring.append(" tble_tble.var LIKE %'%s'%" % var) 
      iter = iter - 1 
 
   for str in substring: 
      query = query + str 
... 

这应该够了。如果从我之前陈述的声明中看不出来,我正在尝试构建一个查询来运行 SQL“LIKE” 列表 相关字符串。

感谢您抽出时间,如有任何问题,请随时提出。

请您参考如下方法:

首先,你的问题与SQL无关。扔掉所有与 SQL 相关的代码并执行此操作:

var = 'foo' 
" OR tble_tble.var LIKE %'%s'%" % var 

你会得到同样的错误。这是因为您正在尝试使用包含杂散 % 符号的字符串进行 % 格式化。因此,它试图找出如何处理 %',但失败了。


你可以像这样避开这些杂散的 % 标志:

" OR tble_tble.var LIKE %%'%s'%%" % var 

但是,这可能不是您想要做的。


首先,考虑使用 {}-formatting 而不是 %-formatting,尤其是当您尝试使用 % 个字符。它避免了转义它们的需要。所以:

" OR tble_tble.var LIKE %'{}'%".format(var) 

但是,更重要的是,您根本不应该进行这种格式化。不要将值格式化为 SQL 字符串,只需将它们作为 SQL 参数传递即可。如果您使用的是 sqlite3,请使用 ? 参数标记;对于 MySQL,%s;对于不同的数据库,请阅读其文档。所以:

" OR tble_tble.var LIKE %'?'%" 

这里没有什么可以出错的,也没有什么需要逃避的。当您使用查询字符串调用 execute 时,将 [var] 作为参数传递。

这要简单得多,而且通常速度更快,并且巧妙地避免了很多处理边缘情况的愚蠢错误,而且最重要的是,它可以防止 SQL 注入(inject)攻击。

sqlite3 docs更详细地解释一下:

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations… Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.) …


最后,正如其他人在评论中指出的那样,对于 LIKE 条件,您必须将百分号放在引号内部,而不是外部。所以,无论你用哪种方式解决这个问题,你都会有另一个问题需要解决。但是那一个应该容易得多。 (如果没有,您随时可以回来问另一个问题。)