今天跟着慕课SpringBoot练习的时候,数据库插入中文遇到了编码错误问题,
.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1366, SQLState: 22001
保存中文数据,发现在数据库中显示为???
最后上网一一排查,解决了这些问题。
参考的文章如下:https://blog.csdn.net/blueheart20/article/details/52385142
文中的环境是在centos下的,我的问题是在windows下的。
排查过程如下:
1. IDE的编码,是否为UTF-8。
解决方案:
以IDEA为例,File->Settings->Editor->FileEncodings,三个关于编码的属性,
FileEncoding,ProjectEncoding,Default encoding for properties全部换成UTF-8
2.代码里的数据库连接URL尾部是否加上了编码设置,&characterEncoding=utf-8
解决方案:jdbc:mysql://localhost:3306/luckymoney?serverTimezone=GMT%2B8&characterEncoding=utf-8
3.本地MySQL的编码格式是否为UTF-8
解决方案:在控制台中,登入mysql,使用show variables like 'char%';命令去查看本机的mysql编码格式
然后把不是UTF-8的全部设置成UTF-8,如果只有部分,可以自己筛选
代码如下:
set character_set_client = utf8;
set character_set_server = utf8;
set character_set_connection = utf8;
set character_set_database = utf8;
set character_set_results = utf8;
set collation_connection = utf8_general_ci;
set collation_database = utf8_general_ci;
set collation_server = utf8_general_ci;
4.已经创建好的数据库编码是否为UTF-8
5.已经创建好的表的编码是否为UTF-8
解决方案:4和5中,我都是在navicat中进行操作的,
修改操作比较简单,不多赘述了
6.已经创建好的表里的字段的编码是否为UTF-8
解决方案:查看出错的表的设计,然后点击指定的字段进行修改
PS:这里有个值得注意的问题,修改好数据库,表的编码以后,已经创建好的表的字段的编码,并不会改变,需要重新去创建
或者去修改出错的字段的编码,然后问题就迎刃而解了,如果项目不复杂,推荐重新建表,避免每个字段都需要修改。
上述的分析过程有一个遗漏的地方,就是MySQL的配置文件,my.ini,不知道这个会不会对乱码产生影响,如果上述过程走完,还是乱码,可以把这个也设置一个默认编码为UTF-8.