最近用StringBoot开发了一个简单的小程序服务器,发现通过post请求插入的中文字段在数据库中是显示“???”的形式,本来不以为意,以为是显示的问题,谁知通过get请求获取数据的时候返回的也是“???”,这下就开始慌了,于是开始了问题的排查。以下为排查的过程。
首先上网搜索“mysql中文乱码”,结果倒是一大堆。
- 排除IDE编码问题
按照网上的信息,先排查IDE的问题,看IntellJ是否设置的了UTF-8的编码格式。
打开setting->editor->code Style->FileEncodings,发现IDE已经为UTF-8的编码,因此排除IDE的问题
- 查看服务器中数据库实际编码格式。
使用root用户登陆数据库,然后发送:show variables like 'character%';
结果显示:
可以看到服务器的编码方式是latin1。查阅资料后发现该编码是MySql的默认编码格式,且该编码不支持中文,因此需要将编码改为utf8格式。
问题找到了,接下来就是怎么样将该编码格式改为utf8的问题,本以为很简单的一件事,却费了我一天的时间来更改。
以下为修改MySql编码过程:
使用命令修改数据库编码
按照网上的说法,登陆数据库,使用命令set character_set_database = utf8;
发现竟然修改成功了,欣喜若狂。再使用命令show variables like 'character%';
查看修改结果,显示编码方式已由latin1改为utf8了。
以为问题就这样解决的时候,再次post中文参数,发现还是“???”,更可气的是,该命令修改完的时候显示是utf8的,重启mysql后又重新变为了latin1。
修改my.cnf配置文件
上述方式无效,再查,说修改配置文件my.cnf。在etc/mysql目录下找到my.cnf文件,在该文件添加default-character-set = utf8
于是使用vim命令编辑该文件,将以上字段复制进去,保存退出。
然后用service mysql start
启动Mysql。
结果:
再次泪奔。网上查了这个错误是指配置不正确导致不能正常启动。
再查,还有说在my.cnf里加default-character-set = utf8mb4
“mb4”是什么鬼?好吧,先试下,或许在服务器上utf8字段不一样呢?
于是再次编辑启动。
结果:
再次失败告终。
再查,有说在工程jdbc连接添加编码的jdbc:mysql://localhost:3306/xjp?useUnicode=true&characterEncoding=UTF-8
再试,或许是jdbc的锅。于是让my.cnf恢复原来样子。
于是再次启动mysql和工程。
能正常运行了,估计这次八九不离十了,然而再次post中文数据过去,还是“???”。天呐,要崩溃了,网上资料那么多,咋就没一个能用的呢?
或许是有隐藏打开方式?于是网上搜索“mysql my.cnf配置”
网上倒是很多对配置项的讲解,我也不深究那么多了,先跑起来再说。于是直接把别人的my.cnf配置复制粘贴到我的my.cnf。
再次启动mysql。
结果:
好吧!内心一万句MMP。
受到my.cnf配置的启发,于是用windows来做下实验,看下windows的配置是怎么样的。
windows下的mysql配置名为my.ini。于是打开搜索”character”,发现文件有一行#character-set-server=
被注释起来了,再一看说明,原来就是用来设置默认编码的。于是赶紧取消注释并加上utf8。
然后重新启动Mysql,发现所有的编码方式已经修改为utf8。且应用运行后使用post传递数据,windows里的mysql居然能正常显示了。这时内心仿佛发现新大陆一样狂燥不已。更令人欣喜的是这个文件顶部的一行文字:
大意是可以直接复制这个文件内容到linux下的my.cnf。
于是把这些内容复制到服务器的my.cnf文件里,然后启动MySql。
结果:
居然连官方也欺骗我,仿佛全世界要把我抛弃了。泪奔。
就在我快要绝望的时候,一道灵光从天上直接打入了我的天灵盖,瞬间开窍了。既然老是提示配置出错,会不会是少加了点什么东西?于是重新去看windows版本的my.ini文件,发现配置下面那么多注释的英文中间会夹杂着[client]、[mysql]、[mysqld]的字样。然后查询了有关的概念。
于是有了这样配置:
就只是在原来的my.cnf文件后面加上了:
[mysqld]
character-set-server=utf8
再次保存启动。
终于能正常运行了。于是激动地要去查看数据库编码。
编码也改为utf8了,感觉这次有戏。
于是把之前的测试数据库删掉(保险起见,删除重建,毕竟被坑怕了),再重新创建及启动应用。这次post终于能正常保存中文数据了。这简直比国足赢了世界杯还要高兴。
花了那么多时间,下面总结下这个问题简单的解决方法:
1、在etc/mysql/目录下找到my.cnf文件(该路径只限默认安装路径,自定义路径自行查找my.cnf的位置)
2、在该文件下方添加
[mysqld]
character-set-server=utf8
然后退出保存重新启动mysql。如果还是不行,有可能是不支持原来的数据库直接修改为utf8编码,请删库重新测试。