MySQL пытается сохранить вашу байтовую строку в символьном столбце.Поскольку для набора символов соединения используется UTF-8, а строка байтов не представляет допустимую последовательность UTF-8, она искажается.
Чтобы правильно загрузить необработанные байты в базу данных, вам необходимо:
делает столбец типом BINARY (или обычно символьным типом с двоичным сопоставлением), а
использует параметризованные запросы для передачи данных в базу данных вместоинтерполируя их в строку запроса, где они могут смешиваться с недвоичным (Unicode) содержимым.
Вы должны использовать параметризованные запросы в любом случае, потому что интерполяция строк, которую вы используете сейчас, без экранированияуязвим для инъекций SQL.В файле web.py это может выглядеть следующим образом:
query_string= 'INSERT INTO %s (%s) VALUES ($value)' % (table, column)
db.query(query_string, vars= {'value': value})
(при условии, что значения table
и column
известны как хорошие.)
Выполнение этого также означает, что вы неНе нужно беспокоиться о знаке доллара.
Другой подход - использовать обычную символьную строку, кодирующую байты, не входящие в ASCII.Вы делаете это с помощью uucode в своем текущем обходном пути, но base64 будет более распространенной альтернативой, к которой проще обратиться в Python (ciphertext.encode('base64')
).Шестнадцатеричное кодирование (.encode('hex')
) наиболее распространено в случае хэша.