【发布时间】:2016-04-06 05:54:20
【问题描述】:
我正在使用 SQLAlchemy 和 MySQL,以及一个 files 表来存储文件。该表定义如下:
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__))
我不太确定 SQLAlchemy 的 BINARY 类型和 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 (@ 987654328@).
【问题讨论】:
-
您似乎正在运行 Python。两个“旁注”指的是 PHP 和 Perl 问题。 Python 中的某些内容未能满足您使用“blob”数据的请求。
-
@RickJames:是的,都是 Python。然而,旁注中的“this answer”链接似乎表明这是一个 MySQL 问题。如果这是一个 Python 问题,我仍然想了解我在这里缺少什么......
-
如果 client(PHP、Python 等)将字符串视为“字符”,则可能会出现此问题。如果它将其视为任意“字节”,则不会出现问题。存储到 MySQL
BLOB不会进行 utf8 检查;存储到TEXT中。 -
所以,我声称,客户端中的一些细节丢失了。 (或者 Alchemy 无法处理
BLOBs。) -
@RickJames:这是一个
b' '对象,即二进制字节......
标签: mysql python-3.x utf-8 sqlalchemy blob