SQLAlchemy résultat pour l'UTF-8 de la colonne est de type 'str', pourquoi?
J'ai une requête SQL que j'exécute comme ça avec un SQLAlchemy moteur:
result = engine.execute('SELECT utf_8_field FROM table')
La base de données est MySQL et le type de colonne est le TEXTE avec l'encodage UTF-8. Le type de retour de la utf_8_field est "str", même si j'ai mis l'option convert_unicode=True lors de la création du moteur. Ce qui arrive maintenant est que si j'ai un caractère comme 'é' dans ma chaîne de caractères (ce qui n'est pas en ASCII 7 bits, mais est dans l'ASCII étendu set), je reçois un UnicodeDecodeError lorsque vous tentez d'exécuter ceci:
utf_8_field.encode("utf-8")
L'erreur exacte est:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 1: ordinal not in range(128)
Lors de la recherche dans ce, j'ai trouvé que str.encoder ne prennent pas en charge le jeu de caractères ASCII étendu! Je trouve cela vraiment étrange, mais c'est une autre question.
Ce que je ne comprends pas, c'est pourquoi SQLAlchemy ne me donne pas une chaîne unicode. J'étais auparavant à l'aide de DB-API et qui fonctionnait bien. Je n'ai pas aussi SQLAlchemy objets de la table pour mes tables encore, c'est pourquoi je suis à l'aide d'une commande execute.
Une idée?
Vous devez vous connecter pour publier un commentaire.
Si vous voulez que les données converties automatiquement, vous devriez spécifier le jeu de caractères lorsque vous créez le moteur:
Réglage
use_unicode
ne suffira pas de dire à sqlalchemy qui jeu de caractères à utiliser.0xe9
. Cela indique qu'il est PAS encodés en UTF-8 ... beaucoup plus susceptibles d'êtrecp1252
.Pour convertir à partir d'un UTF-8 bytestring à un objet unicode, vous devez décoder:
Aussi, lors de l'exécution d'un raw
SELECT
par.execute
, SQLAlchemy a aucune métadonnée de travail que votre requête retourne des données utf-8, donc il n'est pas de convertir cette information en unicode pour vous.En d'autres termes,
convert_unicode
ne fonctionne que si vous utilisez la SQLAlchemy expression SQL API ou de l'ORM fonctionnalité.EDIT: Comme l'a souligné, vos données ne sont pas encore codé en UTF-8;
0xe9
en UTF-8 indique un caractère entre\u9000
et\u9fff
, qui sont CJK unifiée idéogrammes alors que vous avez dit que c'était un caractères latin-1, dont l'UTF-8 code serait de commencer avec0xc3
. C'est probablementISO-8859-1
(latin-1) ou similaire à la place:La conclusion alors est-à-dire de SQLAlchemy pour se connecter avec un autre jeu de caractères, à l'aide de la
charset=utf8
paramètre, comme l'a souligné @mata.ascii
) ne peut pas traiter avec l'encodage UTF-8.. C'est à cause de l'encodage d'une bytestring première nécessite, pour être décodé en unicode, qui est ce qui a échoué.?charset=utf8
résolu pour l'OP indique que la base de données est probablement configuré par défaut pour un autre jeu de caractères est un autre élément de preuve. Encore, appelantencode
sur unstr
est encore une erreur commune qui conduit à cette classe d'erreurs.