Sto usando SQLAlchemy e MySQL, con una tabella files
per archiviare i file. Quel tavolo è definito come segue:Il blob binario SQLAlchemy/MySQL è codificato in 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 | |
+---------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
La colonna contenuto di tipo MEDIUMBLOB
è dove i file sono memorizzati. In SQLAlchemy quella colonna è dichiarato come:
__maxsize__ = 12582912 # 12MiB
content = Column(LargeBinary(length=__maxsize__))
io non sono abbastanza sicuro circa la differenza tra BINARY
tipo di SQLAlchemy e LargeBinary
tipo. O la differenza tra il tipo VARBINARY
di MySQL e il tipo BLOB
. E non sono abbastanza sicuro se questo è importante qui.
Domanda: Ogni volta che memorizzare un file binario vero e proprio in tale tabella, vale a dire un oggetto Python bytes
o b''
, allora ottengo il seguente avvertimento
.../python3.4/site-packages/sqlalchemy/engine/default.py:451: Warning: Invalid utf8 character string: 'BCB121'
cursor.execute(statement, parameters)
non voglio ignorare semplicemente l'avviso , ma sembra che i file siano intatti. Come gestisco questo avviso con garbo, come posso risolvere la sua causa?
Nota a margine:This question sembra essere correlato, e sembra essere un bug di MySQL che si cerca di convertire tutti i dati in entrata in UTF-8 (this answer).
Sembra che tu stia eseguendo Python. Le due "note a margine" si riferiscono ai problemi di PHP e Perl. Qualcosa in _Python_ non sta rispettando la tua richiesta di utilizzare i dati "blob". –
@RickJames: Sì, tutto Python. Il link "[questa risposta] (http://stackoverflow.com/questions/14734812/is-a-blob-converted-using-the-current-default-charset-in-mysql#14745685)" nella nota laterale, tuttavia, sembra indicare che questo è un problema di MySQL. Se questo è un problema di Python, mi piacerebbe comunque capire cosa mi manca qui ... – Jens
Se il _client_ (PHP, Python, ecc.) Tratta la stringa come "caratteri", allora questo problema può sorgere. Se lo tratta come "byte" arbitrari, il problema non si verifica. Memorizzare in un 'BLOB' MySQL non esegue il controllo di utf8; memorizzare in un 'TEXT'. –