【问题标题】:Python: ValueError: unsupported format character ''' (0x27) at index 1Python:ValueError:索引1处不支持的格式字符'''(0x27)
【发布时间】:2012-07-26 14:29:53
【问题描述】:

我正在尝试使用 MySQL 通过 Python 执行查询以搜索数据库中的 3 个表。每次我尝试将以下字符串作为查询执行时,它都会给我一个关于字符串连接的错误。

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"

这是它给我的错误:

ValueError: unsupported format character ''' (0x27) at index 1

如果我删除了它要求的字符,那么我还必须删除 %,这会阻止查询实际正常工作。我能做些什么来解决这个问题,因为我对 Python 还很陌生。

谢谢, 克里斯

【问题讨论】:

  • 为您的 SQL 工具使用内置的字符串替换工具,而不是尝试使用标准 Python 字符串机制自己构建查询字符串。这样效果更好。你在用 MySQLdb 吗?
  • 是的,我正在使用 MySQLdb,我在哪里可以找到这些替代工具?
  • mysql-python.sourceforge.net/… 的文档说,“请注意,传递给 execute() 的查询字符串中的任何文字百分号都必须转义,即 %%。”你在用execute()吗? @Silas 提到的替换工具显示在mysql-python.sourceforge.net/MySQLdb.html#some-examples
  • 请检查以下答案是否仍然有效(适用于 Python 3.5+)。对我不起作用,它尝试了不同的方法。

标签: python mysql mysql-python


【解决方案1】:

看起来 python 正在将 % 解释为类似 printf 的格式字符。尝试使用 %%?

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search)

【讨论】:

  • 非常感谢,成功了! :)
  • 准确来说,MySQLdb 使用 % 运算符将参数放入查询中,因此查询字符串中的任何单个 % 字符都被解释为参数说明符的开始。为防止这种情况发生,请在查询中将 %% 用于 %。另请参阅相应的文档:string formatting
【解决方案2】:

仅供参考:我今天在 Python 3.6 中尝试了 @Pochi 的解决方案,但由于某种原因,它引发了意想不到的行为。我有两个和三个格式字符串参数,所以最后是:

% (Search, Search)

我的字符串(“搜索”)以大写的“S”开头。我收到错误消息:

ValueError: unsupported format character 'S' (0x53) at index 113

我把大写改为小写,报错:

TypeError: not enough arguments for format string

然后我只是将我的论点放在开头和结尾的 double %% 内,它就起作用了。所以我的代码看起来像:

"SELECT fileid 
FROM files 
WHERE description LIKE '%%search%%' 
    OR filename LIKE '%%search%%'
    ORDER BY fileid DESC"

另一个解决方案是@Alice Yuan 提供的解决方案。她只是将唱歌的百分比翻了一番,而且效果很好。

【讨论】:

    【解决方案3】:

    我的解决方案:

    query = """SELECT id, name FROM provice WHERE name LIKE %s"""
    cursor.execute(query, '%%%s%%' % name)
    

    我认为解决这个问题很简单!

    【讨论】:

    • Ehm,您知道%%%s%%' % name 部分是完全没有必要的吗?...查询的参数是%s,它被ORM 或您使用的任何DB 抽象所取代。 ..
    【解决方案4】:

    你可以这样试试:

    SELECT fileid 
    FROM files 
    WHERE description LIKE '%%%%%s%%%%' 
    OR filename LIKE '%%%%%s%%%%' 
    OR uploader LIKE '%%%%%s%%%%' 
    ORDER BY fileid DESC" % (search, search, search)
    

    【讨论】:

    • 你能解释一下为什么这回答了这个问题吗?
    【解决方案5】:

    最简单的答案是将 LIKE 通配符 % 添加到值中。这会正确引用和转义 LIKE 模式。

    在 Python 3.6+ 中,您可以使用 f 字符串在值中包含 LIKE 通配符 %,从而将转义的字符串值正确插入 SQL:

    # string to find, e.g.,
    search = 'find-me'
    
    # Parameterised SQL template
    sql = """SELECT fileid FROM files
    WHERE description LIKE %s OR filename LIKE %s OR uploader LIKE %s
    ORDER BY fileid DESC"""
    
    # Combine LIKE wildcard with search value
    like_val = f'%{search}%'
    
    # Run query with correctly quoted and escaped LIKE pattern
    cursor.execute(sql, (like_val, like_val, like_val))
    

    【讨论】:

      猜你喜欢
      • 2021-08-16
      • 2021-06-06
      • 2023-03-29
      • 1970-01-01
      • 2013-10-28
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多