sqlalchemy mysql 乱码_Python+SQLAlchemy+MySQLdb+MySQL的中文乱码及其解决办法

当使用Python SQLAlchemy连接MySQL数据库时遇到中文乱码问题,可以通过设置`connect_args`或URL参数`charset=utf8`来解决。方法一:`create_engine("mysql://user:pass@localhost/test", connect_args={'charset': 'utf8'})`;方法二:`create_engine("mysql://user:pass@localhost/test?charset=utf8")`。这两个工作原理分别在于更新连接参数和解析URL查询字符串。" 128458332,9871619,CnOpenData发布全国31省景区数据,"['大数据', '数据库', '旅游数据分析']
摘要由CSDN通过智能技术生成

先说结论:

两种办法:

self.engine=create_engine("mysql://user:pass@localhost/test",connect_args={'charset':'utf8'}) workaround 1, take effect

self.engine=create_engine("mysql://user:pass@localhost/test?charset=utf8") #workaround 2, take effect

python: 2.7.2

SQLAlchemy:0.7.2

MySQLdb: 1.2.3

MySQL: 5.1.58

python源文件: # –*- encoding:utf8 –*-

MySQL 都是utf8

create_engine(‘mysql://user:pass@localhost/test’,encoding=’utf8’,echo=True)

如果插入’李小龙’,则python插入数据库的中文字符在mysql client和phpmyadmin中看都是乱码。

如果插入u’李小龙’,那么则报Exception:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)

经过逐步跟踪debug,发现最终问题出在系统中的这个函数上:

sqlalchemy\connectors\mysqldb.py

def create_connect_args(self, url):

。。。。

return [[], opts]

最后一句返回的要传递给MySQLdb的第一部分变量始终是[],而encoding的信息应该存放在这里的,所以即使在程序中设置了encoding=’utf8’也无济于事。

经过分析代码,发现有两种方法可以在不修改库代码的情况下,解决这个问题。

self.engine=create_engine("mysql://root:pass@localhost/test",connect_args={'charset':'utf8'},echo=True) workaround 1, take effect 参见“cparams.update(kwargs.pop('connect_args', {}))”

self.engine=create_engine("mysql://root:pass@localhost/test?charset=utf8",echo=True) #workaround 2, take effect 参见“ opts.update(url.query)”

sqlalchemy\engine\strategies.py

class DefaultEngineStrategy(EngineStrategy):

"""Base class for built-in stratgies."""

def create(self, name_or_url, **kwargs): …

cparams.update(kwargs.pop('connect_args', {}))

sqlalchemy\connectors\mysqldb.py def create_connect_args(self, url)

opts.update(url.query)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值