UTF-8列的SQLAlchemy结果是'str'类型,为什么?

Fae*_*nor 20 python mysql string encoding sqlalchemy

我有一个SQL查询,我使用SQLAlchemy引擎执行此操作:

result = engine.execute('SELECT utf_8_field FROM table')
Run Code Online (Sandbox Code Playgroud)

数据库是MySQL,列类型是TEXT,UTF-8编码.返回的utf_8_field的类型是"str",即使我在创建引擎时设置选项convert_unicode = True.现在发生的事情是,如果我的字符串中有'é'字符(不是7位ASCII,但是在扩展的ASCII集中),我在尝试执行此操作时会得到UnicodeDecodeError:

utf_8_field.encode("utf-8")
Run Code Online (Sandbox Code Playgroud)

确切的错误是:

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

在研究这个时,我发现str.encode不支持扩展的ASCII字符集!我觉得这很奇怪,但这是另一个问题.

我不明白的是为什么SQLAlchemy没有给我一个unicode字符串.我以前使用的是DB-API,而且运行正常.我的表也没有SQLAlchemy表对象,这就是我使用execute命令的原因.

任何的想法?

mat*_*ata 41

如果要自动转换数据,则应在创建引擎时指定charset:

create_engine('mysql+mysqldb:///mydb?charset=utf8')
Run Code Online (Sandbox Code Playgroud)

use_unicode单独设置不会告诉sqlalchemy使用哪个charset.

  • 警告:根据所使用的SQLAlchemy(0.8,0.9,1.0)和数据库(MySQL,PostgreSQL,SQLite)的版本,行为和建议是不同的! (2认同)