Я использую SQLAlchemy и MySQL с таблицей files
для хранения файлов. Эта таблица определяется следующим образом:SQLAlchemy/MySQL двоичный blob кодируется utf-8?
mysql> show full columns in files;
+---------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+---------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| id | varchar(32) | utf8_general_ci | NO | PRI | NULL | | select,insert,update,references | |
| created | datetime | NULL | YES | | NULL | | select,insert,update,references | |
| updated | datetime | NULL | YES | | NULL | | select,insert,update,references | |
| content | mediumblob | NULL | YES | | NULL | | select,insert,update,references | |
| name | varchar(500) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
+---------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
Столбец Содержание типа MEDIUMBLOB
, где хранятся файлы. В SQLAlchemy, что столбец объявлен как:
__maxsize__ = 12582912 # 12MiB
content = Column(LargeBinary(length=__maxsize__))
Я не совсем уверен, о разнице между BINARY
типа SQLAlchemy и LargeBinary
типа. Или разница между типами MySQL VARBINARY
и BLOB
. И я не совсем уверен, что это имеет значение здесь.
Вопрос: Всякий раз, когда я храню фактический двоичный файл в этой таблице, то есть Python bytes
или b''
объект, то я получаю следующее предупреждение
.../python3.4/site-packages/sqlalchemy/engine/default.py:451: Warning: Invalid utf8 character string: 'BCB121'
cursor.execute(statement, parameters)
Я не хочу, чтобы просто игнорировать предупреждение , но кажется, что файлы находятся в такте. Как я могу обработать это предупреждение изящно, как я могу исправить его причину?
Примечание стороны:This question, кажется, связано, и это, кажется, ошибка MySQL, что он пытается преобразовать все входящие данные в UTF-8 (this answer).
Вы, кажется, используете Python. Две «Боковые заметки» относятся к проблемам PHP и Perl. Что-то в _Python_ не выполняет ваш запрос на использование данных «blob». –
@RickJames: Да, все Python. Ссылка «[этот ответ] (http://stackoverflow.com/questions/14734812/is-a-blob-converted-using-the-current-default-charset-in-mysql#14745685)» в боковой заметке, однако, похоже, это проблема MySQL. Если это проблема Python, я бы все же хотел понять, что мне здесь не хватает ... – Jens
Если _client_ (PHP, Python и т. Д.) Обрабатывает строку как «символы», тогда эта проблема может возникнуть. Если рассматривать его как произвольные «байты», то проблема не возникает. Хранение в MySQL 'BLOB' не делает проверку utf8; сохранение в 'TEXT' делает. –