Python: ValueError: символ неподдерживаемого формата '' '(0x27) в индексе 1
Я пытаюсь выполнить запрос для поиска 3 таблиц в базе данных с использованием MySQL через Python. Каждый раз, когда я пытаюсь выполнить следующую строку в качестве запроса, она дает мне ошибку о конкатенации в строке.
"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.
Спасибо,
Kris
Ответы
Ответ 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)
Ответ 2
Только для вас: я попробовал решение @Pochi сегодня, в Python 3.6, и по какой-то причине оно вызвало непредвиденное поведение. У меня было два и три аргумента для строки формата, поэтому в конце было:
% (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
вы можете попробовать следующее:
SELECT fileid
FROM files
WHERE description LIKE '%%%%%s%%%%'
OR filename LIKE '%%%%%s%%%%'
OR uploader LIKE '%%%%%s%%%%'
ORDER BY fileid DESC" % (search, search, search)
Ответ 4
Мое решение:
query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)
Я думаю, что это простой способ исправить эту проблему!
Ответ 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))
python3 mysql-python