您的位置:首页 > 编程语言 > Python开发

python django MySQLdb 连接 mysql 5.5 中文乱码问题的解决

2013-07-22 10:25 1016 查看
本来就想从网上抓取一些页面的内容,然后解析其中的一些正文,放到mysql数据里面。python抓取和解析页面查看一些教程,很快也就解决了。可是,之后的问题画了将近两天的时间才搞定。。那就是中文编码的问题。

最开始出现的问题是,解析的数据已经放入到数据库当中,可是在dump出来的时候,发现全是乱码:
mysqldump -uroot -p --skip-opt database table >temp.sql
正文的部分全是乱码,于是我觉得应该是mysql编码的问题,但是插入数据的,数据库中的中文显示是正常的,或许从数据库中取出数据的时候,编码也出了问题。不管怎样,有一点是清楚的,就是整个过程中对于中文字符的编码方式是不统一的,否则不会出现类似的问题。

Mysql的编码
通过以下方式,查看mysql中一些编码方式:

mysql> SHOW VARIABLES LIKE 'character%';

+----------------------------------------+-------------------------

| Variable_name |Value

+----------------------------------------+-------------------------

| character_set_client | latin1

|character_set_connection | latin1

|character_set_database | utf8

| character_set_filesystem | binary

| character_set_results |latin1

| character_set_server |utf8

| character_set_system |utf8

| character_sets_dir |D:\mysql\share\charsets\

+----------------------------------------+-------------------------

8 rows in set (0.00 sec)

mysql>SHOW VARIABLES LIKE 'collation_%';

+---------------------------------------+------------------

| Variable_name |Value

+---------------------------------------+------------------

| collation_connection |latin1_swedish_ci

| collation_database |utf8_general_ci

| collation_server |utf8_general_ci

+--------------------------------------+------------------

3 rows in set (0.00 sec)

从中我们可以看出,整个编码中,不全是utf8编码的。这样就会造成一些问题,例如:我们抓取的中文是utf8编码的,然后传给mysql,但是mysql的connection和server都是latin1编码的,而表示utf8,于是提交的utf8中文内容,会先被latin1编码,然后再由utf8编码。如果这样的话,再用第三方软件访问数据库就会出现问题,例如用phpadmin等,访问的虽然是utf8内容,但是是由latin1编码过后的utf8字符,不免会出现问题。

解决的方式:当然就是编码统一,全部采用utf8编码方式。如何更改?这里只介绍mysql5.5 以上的修改方式,我的mysql是5.5.29的。修改方式如下:

打开mysql配置文件:sudovim /etc/mysql/my.cnf

[mysqld]

character-set-server=utf8

collation-server=utf8_general_ci

[client]

default-character-set=utf8

在配置文件中,对应的标签中,添加以上字符编码内容。

之后重启mysql服务:sudo/etc/init.d/mysql restart

如果重启成功,说明配置文件没有问题,如果重启失败,说明配置文件有问题,可能你用的mysql版本不是如上的修改方式,可以上网查对应版本的utf8编码的修改方式。

这样,在用刚才的方式查看SHOWVARIABLES LIKE '%char%';,应该都是utf8编码了。(有一个是binary编码的,不用管)

读取时候的编码定义

例如在用MySQLdb读取数据库内容时候,可以定义读取数据库的编码方式:

MySQLdb.connect(server, user, passwd, dbname,charset="utf8")

另外在python头部也可以定义一些中文编码的方式,例如:

#-*- coding: UTF-8 -*-

importsys

reload(sys)

sys.setdefaultencoding('utf8')

总之,在整个过程中,一定要保持编码方式的统一,从网上抓取下来的数据,也要先encode一下,整个过程中如果编码都是utf8,那无论怎么读取都不会出现乱码啦。

#http://blog.sina.com.cn/s/blog_4aa65a3f01018xgk.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐