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
最开始出现的问题是,解析的数据已经放入到数据库当中,可是在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
相关文章推荐
- Python连接MySQL中有关中文乱码的解决问题
- Python连接MySQL中有关中文乱码的解决问题
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
- Python - MySQLdb.connect连接lampp中mysql服务器问题的解决
- 关于python连接mysql中文乱码问题
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
- Linux下MySQL 5.5/tomact6/Centos 的修改字符集编码为UTF8(彻底解决中文乱码问题)
- python2学习笔记之mysql连接,中文乱码的解决和文件api的使用
- 如何解决python连接数据库编码问题(python传数据到mysql乱码)'ascii' codec can't encode _mysql_exceptions.OperationalError: (1366, "Incorrect string value:?
- 解决python连接mysql,UTF-8乱码问题
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
- MySQL 5.5版本解决中文乱码问题时my.ini内[mysqld]项中不能再写default-character-set=utf8
- Python mysqldb 操作mysql出现中文乱码问题
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
- 解决python连接mysql,UTF-8乱码问题
- MySQL 5.5版本解决中文乱码问题时my.ini内[mysqld]项中不能再写default-character-set=utf8
- MySQL 5.5版本解决中文乱码问题
- 设置MySql5.5数据库的字符编码为UTF8,解决中文乱码问题