SpringBoot MySql数据库中文乱码问题排查实纪

引言:

最近用StringBoot开发了一个简单的小程序服务器,发现通过post请求插入的中文字段在数据库中是显示“???”的形式,本来不以为意,以为是显示的问题,谁知通过get请求获取数据的时候返回的也是“???”,这下就开始慌了,于是开始了问题的排查。以下为排查的过程。

首先上网搜索“mysql中文乱码”,结果倒是一大堆。
- 排除IDE编码问题
按照网上的信息,先排查IDE的问题,看IntellJ是否设置的了UTF-8的编码格式。
打开setting->editor->code Style->FileEncodings,发现IDE已经为UTF-8的编码,因此排除IDE的问题
SpringBoot MySql数据库中文乱码问题排查实纪_第1张图片

- 查看服务器中数据库实际编码格式。
使用root用户登陆数据库,然后发送:show variables like 'character%';
结果显示:
SpringBoot MySql数据库中文乱码问题排查实纪_第2张图片

可以看到服务器的编码方式是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。
SpringBoot MySql数据库中文乱码问题排查实纪_第3张图片
然后重新启动Mysql,发现所有的编码方式已经修改为utf8。且应用运行后使用post传递数据,windows里的mysql居然能正常显示了。这时内心仿佛发现新大陆一样狂燥不已。更令人欣喜的是这个文件顶部的一行文字:
SpringBoot MySql数据库中文乱码问题排查实纪_第4张图片
大意是可以直接复制这个文件内容到linux下的my.cnf。
于是把这些内容复制到服务器的my.cnf文件里,然后启动MySql。
结果:
这里写图片描述
居然连官方也欺骗我,仿佛全世界要把我抛弃了。泪奔。

就在我快要绝望的时候,一道灵光从天上直接打入了我的天灵盖,瞬间开窍了。既然老是提示配置出错,会不会是少加了点什么东西?于是重新去看windows版本的my.ini文件,发现配置下面那么多注释的英文中间会夹杂着[client]、[mysql]、[mysqld]的字样。然后查询了有关的概念。
于是有了这样配置:
SpringBoot MySql数据库中文乱码问题排查实纪_第5张图片
就只是在原来的my.cnf文件后面加上了:

[mysqld]
character-set-server=utf8

再次保存启动。
终于能正常运行了。于是激动地要去查看数据库编码。
SpringBoot MySql数据库中文乱码问题排查实纪_第6张图片
编码也改为utf8了,感觉这次有戏。
于是把之前的测试数据库删掉(保险起见,删除重建,毕竟被坑怕了),再重新创建及启动应用。这次post终于能正常保存中文数据了。这简直比国足赢了世界杯还要高兴。
这里写图片描述

花了那么多时间,下面总结下这个问题简单的解决方法:
1、在etc/mysql/目录下找到my.cnf文件(该路径只限默认安装路径,自定义路径自行查找my.cnf的位置)
2、在该文件下方添加

[mysqld]
character-set-server=utf8

然后退出保存重新启动mysql。如果还是不行,有可能是不支持原来的数据库直接修改为utf8编码,请删库重新测试。

你可能感兴趣的:(SpringBoot)