0、省流
在服务器上创建数据库服务时,使用的sql脚本加载的数据库表,其中脚本中有一些预设的测试数据包含中文汉字,由于linxu服务器控制台默认编码是lantin1
,导致中文通过该编码方式被编码成了乱码之后并存到了数据库中,而我们设置的读取规则的编码都是utf-8
, 因此在navicat
以及读到前端上中文显示的都是乱码。
除非将数据库表的编码规则设成lantin1
(不过没人会设吧,都是用utf-8
),不然解决的方法就是手动将这些乱码修改成中文。不过不影响新添加的中文汉字数据,因为这些汉字没有经过lantin1
编码。另一个方法就是修改控制台编码为utf-8
,防止下次再加载脚本时汉字变成乱码,修改语句为:
export LANG=en_US.UTF-8
1、问题出现
-
在建表的时候我使用的是下面的语句:
DROP TABLE IF EXISTS `hoppy_sets`; CREATE TABLE `hoppy_sets` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `hoppy_name` VARCHAR ( 10 ) NOT NULL COMMENT '爱好大类名', `create_by` BIGINT DEFAULT NULL COMMENT '创建人', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` BIGINT DEFAULT NULL COMMENT '更新人', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `del_flag` TINYINT DEFAULT 0 COMMENT '删除标记' ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '爱好大类表';
设置了字符集为
utf8mb4
和排序规则为utf8mb4_general_ci
,对汉字是兼容的。 -
在控制台读取汉字显示正常
当我在控制台读取数据的时候,汉字显示是正常的
-
navicat中和前端读取显示中文乱码
但是在navicat中和读取到前端展示的时候却出现了乱码:
2、问题排查
首先springboot连接是没问题的,设置的编码是utf8
jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
但是读取的时候就成了乱码:
数据库中设置的字符集也没问题:
然后我通过navicat
把 gender_types
表中的乱码数据修改成中文,发现springboot读取的正常了,前端也能正常显示。
但控制台输出的中文却变成了???
。
我就在想会不会是服务器的编码问题,之后通过查阅资料找到了一些描述:
意思是服务器的控制台编码是Latin1
导致中文显示出了问题,然后我按照它的解决方法,将控制台的编码改成utf-8
export LANG=en_US.UTF-8
然后这些问号就变成了正常的中文数据,但是没改的那些数据在控制台输出却变成了乱码。
3、结论
通过上面的分析,看来是控制台编码与数据库编码不一致搞得鬼。
一开始控制台的编码是latin1
,控制台输出正常,但是其他方式乱码。说明存到数据库里的数据就是用latin1
编码的,而不是utf-8
。
但为什么不是utf-8
编码的呢?
因为在创建数据库的时候,我通过加载sql
脚本的方式创建的数据库表,里面有一些插入语句插入中文数据,因此在加载的时候这个数据的中文被控制台latin1
编码,然后存入了数据库中。因此在控制台输出不是乱码,而读取的时候用utf8
读的就是乱码了。把控制台的编码改成utf8
之后,之前的那些被latin1
编码的中文,在控制台输出自然就又变成了乱码。