为什么SQLAlchemy create_engine与charset = utf8返回python类型<str>而不是键入<unicode>?</unicode> </str>

时间:2013-09-25 20:58:32

标签: python mysql unicode utf-8 sqlalchemy

使用Python 2.7和SQLAlchemy 0.7,我使用以下命令连接MySQL DB:

engine = create_engine('mysql://username:password@host/dbname?charset=utf8',echo=False)

根据SQLAlchemy文档,设置charset = utf8会自动暗示use_unicode = 1,因此所有字符串都应该作为unicode返回。 http://docs.sqlalchemy.org/en/rel_0_7/dialects/mysql.html专门给出了示例

  

#set客户端编码为utf8;所有字符串都以unicode形式返回   create_engine( '的MySQL + MySQLdb的:/// mydb的字符集= UTF8')

那么,为什么当我在映射类中查询文本字段时,该字段最终是否为“str”类型?

Base = declarative_base(engine)

class RegionTranslation(Base):
    ''''''
    __tablename__ = 'RegionTranslation'
    __table_args__ = {'autoload':True}
    def __init__(self, region_id, lang_id, name):
        self.region_id = region_id
        self.lang_id = lang_id
        self.name = name

rtrans = session.query(RegionTranslation).filter_by(region_id = 1, lang_id = 6).one()
print (type(rtrans.name))

输出

 <type 'str'>

如果我只是接受这个并在使用之前解码字符串,那么事情就好了。但我不明白为什么上面的代码没有返回类型'unicode'。有人可以,请解释一下吗?

1 个答案:

答案 0 :(得分:4)

当发现我成功运行多次的不同脚本不再有效时,终于找到了答案。

我已将数据库中的排序规则从utf8_general_ci更改为utf8_bin。 MySQLdb 1.2.3中存在一个错误,导致utf8_bin字符串无法被识别为文本,因此不会发生unicode转换。这已在MySQLdb 1.2.4中修复。

https://sourceforge.net/p/mysql-python/bugs/289/