mysql数据库编码问题的原因与解决方法

好像这里必须要写点什么才不会显示整篇文章

mysql为不同场景下配置了不同的编码方案,像数据的存储,数据库连接的当前编码,我们通过sql语句show variables like '%character%';就可以看到如下显示:详细解释了各种场景下编码的意义:

a、其中client是客户端使用的字符集,相当于网页中的字符集设置如下


b、其中的connection是连接数据库的字符集设置类型,如果php没有指明连接数据库使用的字符集类型
就按照服务器端默认的字符集设置。
c、其中database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装
时指定的字符集设置。
d、results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
e、server是服务器安装时指定的默认字符集设定。
f、system是数据库系统使用的字符集设定。

我们从PHP对数据库进行操作的一次过程中,涉及到多个场景,先是PHP自身编码方案决定了它构建并发出的那条sql语句是什么编码的,之后语句执行后拿到的数据又会是一种编码,就是数据库中存储数据的编码方案,之后再以发送给php,这些场景中数据的编码方案是不同的,而mysql会在不同场景切换中对数据进行编码转换话,如果执行过程中数据的编码转化与mysql上表的配置不同,就会出现编码的问题,而出现问题的原因一般有两条:

数据库对数据存储的编码方案

这个问题的产生比较奇怪,从上面表的character_set_database 我们可以看到,默认的数据库对数据存储的编码方案采用的是latin1,这种编码方案收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号,但是没有中文!!!!所以遇到中文的编码方案会出现报错或是乱码。。。
解决的方式也很简单,我们在新建数据库时为其指定默认的编码方案,使用支持中文的gbk,utf8编码就好了

1
2
create database test default character set gbk;
create database test default character set utf8;

之后进入到这个数据库再看编码方案,在character_set_database那一栏就会有对应的修改了

sql语句的编码方案

也就所输入sql语句是怎样编码的,如果sql语句的编码与mysql中记录的理解方式也就是编码方案不同,那自然也会出现问题。
给出几个场景的例子,比如我在cmd中对mysql进行操作,cmd的默认编码是GBK
而mysql中会按照记录中的utf8进行操作,这时就是出现问题
再比如PHP所发出的sql语句具体采用什么编码方案,取决于PHP运行环境中的编码(如果你不进行手动的解码再编码到指定码的话),这时也有可能出现于mysql中默认编码方案不同的问题

解决方式同样很简单,我们进行数据库操作时候,无论是使用命令行,还是调用高级语言的接口,都先指定自己的sql语句是以什么形式编码的,即语句set names 编码方案。这样之后就会修改当前操作下mysql的编码方案,像这张图就是我执行set names gbk后的改变结果:

正好今天在用python3链接数据库,把我的编码配置扔出来

  • 数据库编码还是在创建时改为utf8
  • 链接时指定客户端编码
    pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='blog', charset='utf8')
  • 指定编码格式
    cur.execute("set names utf8")

然后就OK了