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

问题描述 投票:0回答:6

我正在尝试通过 Python 使用 MySQL 执行查询来搜索数据库中的 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 还很陌生。

python mysql mysql-python
6个回答
123
投票

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

4
投票

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

% (Search, Search)

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

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

我把大写改成了小写,错误是:

TypeError: not enough arguments for format string

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

"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)

我认为这是解决这个问题的简单方法!


1
投票

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


0
投票

你可以这样尝试:

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

0
投票

我认为2024年最好的解决方案是

sqlalchemy.text
,这个方法让sql字符串保持应有的样子。

import sqlalchemy as sa
sqlstr = "SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"

conn = sa.create_engine("xxxxx")
conn.execute(sa.text(sqlstr))
© www.soinside.com 2019 - 2024. All rights reserved.