python,mysql,MySQLDb支持中文(utf-8编码)

来源:互联网 发布:手机转换格式软件 编辑:程序博客网 时间:2024/06/10 07:09
只要使用utf-8编码,就可以支持中文。我们的软件都是跑在linux上面的,都是utf-8,所以支持中文就是如何支持utf-8的。
python默认编码:是系统编码,所有有些机器不是utf-8的(可能没有中文原因,是ASCII编码)。
Mysql默认是latin1编码,很简单,开发商是瑞典公司。
让python的编码设为utf-8,在最开始运行:
import sys;
# set the default encoding to utf-8
# reload sys model to enable the getdefaultencoding method.
reload(sys);
# using exec to set the encoding, to avoid error in IDE.
exec("sys.setdefaultencoding('utf-8')");
assert sys.getdefaultencoding().lower() == "utf-8";
也可以直接执行sys.setdefaultencoding('utf-8'),我使用exec是因为windows下的elipse找不到这个函数会报错(执行没有问题,是site.py这个把setdefaultencoding删除了,使用reload就可以重新加载进来)。
现在所有的python的都是utf-8的了,但是为什么写入数据库的中文还是乱码呢?而且有时候会有错误,说latin1无法编码字符串。
MySQLDb连接上mysql后应该执行如下的语句:
db = MySQLdb.connect(host=Config.mysqlHost,
user=Config.mysqlUser, passwd=Config.mysqlPassword, db=Config.mysqlDatabase,
charset="utf8");
conn = db.cursor();
conn.execute("SET NAMES utf8");
db.commit();
不必要执行下面两句:
conn.execute("SET CHARACTER_SET_CLIENT=utf8");
conn.execute("SET CHARACTER_SET_RESULTS=utf8");
set names就会设置它们。
然后插入中文不会报错,但是用mysql客户端连接上看还是乱码,为什么呢?
是mysql客户端也要设置,不同的系统还不一样。
windows下进入数据库后,执行:set names gbk。linux执行set names utf8
就没有问题了。实际上数据是以utf-8编码的。

最后转码的文件以中文命名,直接用windows的exporer打开看也是乱码,在系统下看是中文。
原因也是一样,ftp客户端也有编码格式的。用flashxp或者其他ftp工具,设置编码为utf-8就可以看到了。

还有一个地方很坑爹,就是必须指定json.dumps(ensure_ascii=False),默认是True,就会把中文搞成乱码。
原创粉丝点击