Python2-Pymysql中文写入

python27的编码是一大难点,然而这次的难点并不是在于python,而在于数据库。

前言

最近在使用Pymysql向mysql数据库写入中文时,发现出现Warning:(1366, u”Incorrect string value: ‘\x······”)
pymysql_warning.png
数据库里面的结果为乱码
database_result.png

解决思路

看到中文乱码,马上就想到编码问题。该问题共涉及到三处编码(有可能还多,想不出来了):数据库编码、数据来源编码、脚本连接编码。由于数据来源编码能肯定为Unicode,因此需要从脚本连接编码、数据库编码去解决。

解决历程

脚本连接编码

由于pymysql支持charset字段,下意识想到通过charset参数进行设置。

1
2
3
4
5
6
7
8
9
10
11
12
import pymysql.cursors

config = {
'host':'127.0.0.1',
'port':3306,
'user':'root',
'password':'',
'db':'test',
'charset':'utf8mb4',
'cursorclass':pymysql.cursors.DictCursor,
}
connection = pymysql.connect(**config)

然后重新运行脚本,发现并没有解决。

数据库编码

查看数据库编码,发现数据库默认编码为latin1。

1
show variables like "char%";

mysql_charset.png
找到问题所在就方便了!修改database编码即可。
由于我使用的是debian,需要修改/etc/mysql/my.cnf文件。

1
vim /etc/mysql/my.cnf

在[mysqld]字段下面添加character-set-server=utf8,保存并重启mysql服务即可。
my_cnf_set.png
重新查询数据库编码。
database_charset.png
美滋滋的运行代码,发现还是Warning!!!

最终解决

在修改了数据库编码以为脚本可以成功运行的时候,现实跟我说too young!后面兜兜转转,发现重新建立数据库即可!

总结

  1. Python27遇到中文的时候,需要特别注意编码;
  2. Python进行数据交互的时候,每个地方的编码都需要注意;
  3. 配置修改之后,一定要刷新或者新建!!!