在springboot项目中,通过前端页面操作对mysql插入数据,在包含中文数据的情况下插入失败,通过后台代码可以看到抛出类似如下的异常:
java.sql.SQLException: Incorrect string value: '\xE7\x9A\x84\xE8\x90\xA8...' for column 'name' at row 1
很显然,我们在name属性中设置的中文出现了编码问题导致插入数据库失败。
问题排查:
1、在后台打印前端传过来的数据显示中文正常,排除了前端传到后台数据出错问题。
2、首先想到的就是连接数据库的url配置字符集是否有问题,查看配置文件如下,显然也没问题
url: jdbc:mysql://127.0.0.1:3306/xxxx?useUnicode=true&characterEncoding=utf-8
3、基本定位就是数据库的编码设置有问题了。
通过
- show create database xxxx1(数据库名);
- show create table xxxx2(表名);
可以看到数据库以及数据表的编码都是mysql的默认编码latin1,如表:
CREATE TABLE `xxxx2` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(30) NOT NULL COMMENT '名称'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
修改数据库以及数据表的编码:
- alter database xxxx1 character set utf8; //修改数据库编码
- alter table xxxx2 default character set utf8; //修改数据表编码
此时执行插入中文操作依然显示失败。
4、想了很久也找不到问题所在,最后重新执行 show create table xxxx2; 看到如下表结构:
CREATE TABLE `xxxx2` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(30) CHARACTER SET latin1 NOT NULL COMMENT '名称',
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
可以看到字段的编码为latin1,显然就有问题
通过如下命令修改字段的编码:
ALTER TABLE xxxx2 CHANGE name name varchar(30) CHARACTER SET utf8 NOT NULL COMMENT '名称';
最后测试插入含中文的sql,能够成功执行。
附录:
另外,可以通过 show variables like "% character %"; 查看mysql的编码设置。
MySql的配置文件在Windows下是在安装目录的my.ini,在Linux下为/etc/my.cnf,修改为utf8可以在配置文件中添加
-在 [mysqld] 标签下加上以下内容:
default-character-set = utf8
character_set_server = utf8
之后重起 mysql 服务即可。