Ho una query SQL che ho eseguito come questo con un motore SQLAlchemy:Il risultato di SQLAlchemy per la colonna UTF-8 è di tipo "str", perché?
result = engine.execute('SELECT utf_8_field FROM table')
Il database è MySQL e il tipo di colonna è TEXT con codifica UTF-8. Il tipo di utf_8_field restituito è "str", anche se imposto l'opzione convert_unicode = True durante la creazione del motore. Quello che succede ora è che se ho un carattere come 'é' nella mia stringa (che non è in ASCII a 7 bit, ma è nel set ASCII esteso), ottengo un errore UnicodeDecodeError quando cerco di eseguire questo:
utf_8_field.encode("utf-8")
l'errore esatto è:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 1: ordinal not in range(128)
Quando si cerca in questo, ho trovato che str.encode non supportano il carattere ASCII esteso set! Lo trovo davvero strano, ma questa è un'altra domanda.
Quello che non capisco è perché SQLAlchemy non mi sta dando una stringa unicode. In precedenza utilizzavo DB-API e funzionava perfettamente. Inoltre non ho ancora oggetti SQLAlchemy per le mie tabelle, ecco perché sto usando un comando execute.
Qualche idea?
Grazie, ora converte il mio campo utf-8 in stringhe python unicode. – Faelenor
In base al messaggio di errore, il primo byte non ASCII nel "campo utf-8" è '0xe9'. Ciò indica che è ** NON ** codificato in UTF-8 ... molto più probabile che sia 'cp1252'. –
@JohnMachin - sì, perché se non si specifica un set di caratteri durante la creazione del motore, mysqldb sembra essere impostato su latin1. L'impostazione del set di caratteri indica sia al db ant che al client di utilizzare la codifica di trasferimento corretta e quindi corregge il problema. – mata