私はファイルを格納するfiles
テーブルとSQLAlchemyとMySQLを使用しています。ファイルが格納されている場所のタイプMEDIUMBLOB
の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 | |
+---------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
コンテンツ列は次のようにそのテーブルが定義されています。私はSQLAlchemyののBINARY
タイプとLargeBinary
タイプの違いについてかなりわからない
__maxsize__ = 12582912 # 12MiB
content = Column(LargeBinary(length=__maxsize__))
:SQLAlchemyのでは、その列は次のように宣言されています。または、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関連しているように思われ、UTF-8(this answer)にすべて入ってくるデータを変換しようとすると、MySQLのバグのようです。
あなたはPythonを実行しているようです。 2つの「サイドノート」は、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'に格納します。 –