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

只要使用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,就会把中文搞成乱码。

你可能感兴趣的:(python,mysql,MySQLDb支持中文(utf-8编码))