SQLAlchemy的结果为UTF-8列的类型为“海峡”,为什么呢?(SQLAlchemy resu

2019-07-29 15:23发布

我有执行这样与SQLAlchemy的发动机的SQL查询:

result = engine.execute('SELECT utf_8_field FROM table')

该数据库是MySQL和列类型是TEXT用UTF-8编码。 该类型返回utf_8_field的是“海峡”,即使我在创建引擎时所设置的选项convert_unicode =真。 现在会发生什么,如果我在我的字符串有一个像“E”字符(这是不是在7位ASCII,但在扩展ASCII字符集),我想执行这个时候得到一个UnicodeDecodeError错误:

utf_8_field.encode("utf-8")

确切的错误是:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 1: ordinal not in range(128)

当寻找到这一点,我发现str.encode不支持扩展ASCII字符集! 我觉得这很奇怪,但这是另外一个问题。

我不明白的是为什么SQLAlchemy的是不是给我一个unicode字符串。 我以前使用DB-API和工作正常。 我还没有为我的表SQLAlchemy的表对象还没有,这就是为什么我使用的是执行命令。

任何的想法?

Answer 1:

如果你想要的数据自动转换,你应该指定字符集,当您创建引擎:

create_engine('mysql+mysqldb:///mydb?charset=utf8')

设置use_unicode本身不会告诉SQLAlchemy的哪个字符集来使用。



Answer 2:

要从UTF-8字节字符串将Unicode对象转换,您需要解码

utf_8_field.decode('utf8')

此外,执行原料时SELECT通过.execute ,SQLAlchemy的没有元数据,以制定出您的查询返回UTF-8的数据,所以它不转换该信息为Unicode为您服务。

换句话说, convert_unicode如果您使用的SQLAlchemy SQL表达式API或ORM功能才起作用。

编辑:正如指出的那样,你的数据更是连UTF-8编码; 0xe9在UTF-8将指示之间的字符\u9000\u9fff ,这是当你说这是一个拉丁文1个字符,它的UTF-8编码将开始与CJK统一汉字0xc3 。 这可能是ISO-8859-1 (Latin-1的)或类似的代替:

>>> u'é'.encode('ISO-8859-1')
'\xe9'

那么结论是告诉SQLAlchemy的用不同的字符集连接,使用charset=utf8参数,如@mata指出。



文章来源: SQLAlchemy result for UTF-8 column is of type 'str', why?