Я воспроизвел вышеуказанную ошибку:
Traceback (most recent call last):
File "demo.py", line 16, in <module>
cursor.execute(query, ())
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte '0xff ... '
in position 0: invalid start byte
Использование версий:
$ python --version
Python 2.7.10
>>> mysql.connector.__version__
'8.0.15'
С кодом Python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import mysql.connector
conn = mysql.connector.connect(
user='asdf',
password='asdf',
host='1.2.3.4',
database='the_db',
connect_timeout=10)
cursor = conn.cursor(buffered=True) #error is raised here
try:
query = ("SELECT data_blob FROM blog.cmd_table")
cursor.execute(query, ())
except mysql.connector.Error as err: #error is caught here
#error is caught here, and printed:
print(err) #printed thustly
Использование Python-переменной «raw-байтовый двоичный файл», заполненной Python open(
следующим образом:
def read_file_as_blob(filename):
#r stands for read
#b stands for binary
with open(filename, 'rb') as f:
data = f.read()
return data
Таким образом, проблема находится где-то между преобразованием кодирования данных в файле-> кодирование данных для BLOB-объекта mysql -> и как mysql поднимает этот BLOB-объект и преобразует его обратно в utf-8.
Два решения:
Решение 1 - этоточно так же, как сказал AHalvar, установите параметр use_pure=True
и передайте значение mysql.connector.connect( ... )
.Тогда загадочным образом это просто работает.Но хорошие программисты заметят, что задержка в таинственном заклинании - это неприятный запах кода.Исправления по броуновскому движению влекут за собой технические долги.
Решение 2 состоит в том, чтобы кодировать ваши данные рано и часто, и предотвратить двойное перекодирование и двойное декодирование данных, которое является источником этих проблем.Зафиксируйте его в общем формате кодирования как можно скорее.
Приятным решением для меня было принудительное использование кодировки utf-8 на более ранних этапах процесса.Повсеместное применение UTF-8.
data.encode('UTF-8')
Юникодная куча poo отражает мое мнение о такой няне кодирования символов между различными устройствами в разных операционных системах и схемах кодирования.