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

引言:

最近用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编码,请删库重新测试。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Spring Boot提供了多种方法来执行MySQL数据库备份,以下是其中两种方法: 1. 使用Spring Boot Actuator进行备份 可以使用Spring Boot Actuator的`/actuator`端点来执行备份。首先需要在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` 然后在`application.properties`文件中添加以下配置: ``` management.endpoints.web.exposure.include=* ``` 接下来,可以通过访问`/actuator`端点来执行备份。例如,要备份MySQL数据库,可以使用以下命令: ``` curl -X POST http://localhost:8080/actuator/mysqlbackup ``` 其中,`mysqlbackup`是自定义的备份端点名称。备份文件将保存在应用程序的工作目录中。 2. 使用备份脚本进行备份 可以创建一个备份脚本,使用`mysqldump`等选择的数据库备份工具来执行数据库备份操作。以下是一个使用`mysqldump`备份MySQL数据库的示例脚本: ```bash #!/bin/bash # 数据库连接参数 DB_HOST="localhost" DB_PORT="3306" DB_USER="your_username" DB_PASS="your_password" DB_NAME="your_database" # 备份文件名 BACKUP_FILE="/path/to/backup.sql" # 执行备份 mysqldump -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE ``` 将上述脚本保存为`backup.sh`文件,并使用`chmod +x backup.sh`命令将其设置为可执行文件。然后可以使用`./backup.sh`命令执行备份。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值