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编码方式。如何更改?这里只介绍mysql
5.5 以上的修改方式,我的mysql是5.5.29的。修改方式如下:
打开mysql配置文件:sudo
vim /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编码的修改方式。
这样,在用刚才的方式查看SHOW
VARIABLES LIKE '%char%';,应该都是utf8编码了。(有一个是binary编码的,不用管)
读取时候的编码定义
例如在用MySQLdb读取数据库内容时候,可以定义读取数据库的编码方式:
MySQLdb.connect(server, user, passwd, dbname,
charset="utf8")
另外在python头部也可以定义一些中文编码的方式,例如:
#-*- coding: UTF-8 -*-
import
sys
reload(sys)
sys.setdefaultencoding('utf8')
总之,在整个过程中,一定要保持编码方式的统一,从网上抓取下来的数据,也要先encode一下,整个过程中如果编码都是utf8,那无论怎么读取都不会出现乱码啦。