Python:ValueError:索引1处不支持的格式字符'''(0x27)

时间:2012-07-27 21:20:51

标签: python mysql mysql-python

我正在尝试执行查询以使用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很陌生。

谢谢, 克里斯

5 个答案:

答案 0 :(得分:62)

看起来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)

答案 1 :(得分:0)

你可以这样试试:

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

答案 2 :(得分:0)

我的解决方案:

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

我认为解决此问题的方法很简单!

答案 3 :(得分:0)

仅供您参考:我今天在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提供的解决方案。她的唱歌比例只增加了一倍,而且效果很好。

答案 4 :(得分:0)

最简单的答案是将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))