一、问题展示
在公司做项目,遇到一个问题,项目代码没动,只切换了数据源(数据库连接),库中就出现了中文乱码,示例如下:
A库
B库
二、问题分析
我业务代码没动,排除了业务层的数据编码问题,那就是库的问题。首先看库的编码
1.查看数据库编码格式
show variables like 'character_set_database' ;
2.查看数据表的编码格式
show create table <表名>;
A库编码
A库的数据表编码
B库编码
B库数据表编码
由上述截图可以看出,两个库的编码和表的编码都一致,那就不是库的编码格式问题,查看库的版本:
A库版本5.7,B库版本5.5,版本出现差异,根据查询得知,MySQL 5.7会出现中文 ? 格式的乱码,说明是库版本问题。
三、问题处理
3.1.修改JDBC连接
order.datasource.url=jdbc:mysql://ip:port/tableName?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8
在原数据连接后面添加characterEncoding=UTF-8,与前一个字段之间,使用&符号连接。
注:我公司用的nacos版本较低,所以JDBC连接的tableName之后的东西不能有,否则会报错。因此,我原本是没有后面的那些东西的。但在数据库连接和nacos配置出现冲突之后,数据库版本和nacos版本不能动,那我只能选择抛弃nacos,将参数配置在jar内。结果如下:
3.2.修改数据库版本
如果是个人项目,重装一个低版本(5.5或5.6)的数据库就行,或者装一个8.0+的数据库就行,但流程比较繁琐,本文不再介绍;
如果是公司项目,数据库一般是不能动的,那还是使用3.1中的方法就行。