解决mysql数据库表读取中文乱码问题

0、省流

在服务器上创建数据库服务时,使用的sql脚本加载的数据库表,其中脚本中有一些预设的测试数据包含中文汉字,由于linxu服务器控制台默认编码是lantin1,导致中文通过该编码方式被编码成了乱码之后并存到了数据库中,而我们设置的读取规则的编码都是utf-8, 因此在navicat以及读到前端上中文显示的都是乱码。

除非将数据库表的编码规则设成lantin1(不过没人会设吧,都是用utf-8),不然解决的方法就是手动将这些乱码修改成中文。不过不影响新添加的中文汉字数据,因为这些汉字没有经过lantin1编码。另一个方法就是修改控制台编码为utf-8,防止下次再加载脚本时汉字变成乱码,修改语句为:

export LANG=en_US.UTF-8

1、问题出现

  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,对汉字是兼容的。

  2. 在控制台读取汉字显示正常

    当我在控制台读取数据的时候,汉字显示是正常的

    在这里插入图片描述

  3. 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编码的中文,在控制台输出自然就又变成了乱码。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值