最近遇见了一个很奇怪的问题

从数据库中读取中文字符的时候,会出现乱码问题

首先一步一步检查字符编码问题

一开始数据库是用Navicat创建的

数据库到java 乱码 数据库乱码问题_数据库

可以看出数据库中的格式是UTF-8

数据库到java 乱码 数据库乱码问题_database_02


JDBC的连接字符集格式也是UTF-8

数据库到java 乱码 数据库乱码问题_中文字符_03


文件编码也是UTF-8

打印表中一行数据测试,原数据与打印结果如下

数据库到java 乱码 数据库乱码问题_数据库_04

数据库到java 乱码 数据库乱码问题_数据库_05


发现在Navicat中是正常显示,但是最后获取到的中文是呈现乱码形式

为了进一步定位问题,使用CMD查看数据库内容

发现在CMD中查看,确实是以乱码形式存储

数据库到java 乱码 数据库乱码问题_数据库到java 乱码_06


使用show variables like "character%";查看编码格式,如下所示

数据库到java 乱码 数据库乱码问题_文件编码_07


使用SET NAME GBK尝试,发现仍然不行

数据库到java 乱码 数据库乱码问题_文件编码_08


最后使用CMD规定格式重新建表,发现在CMD里显示以及程序中读取都是正确结果

数据库到java 乱码 数据库乱码问题_数据库到java 乱码_09


数据库到java 乱码 数据库乱码问题_文件编码_10


但是我不可能每次都需要在CMD中创建,这太繁琐,此时使用Navicat重新创建一个数据库

数据库到java 乱码 数据库乱码问题_文件编码_11


发现程序以及CMD读取都依旧乱码,此时发现用Navicat读取之前CMD创建的数据库,中文也是乱码

数据库到java 乱码 数据库乱码问题_数据库到java 乱码_12


问题好像慢慢地开始明朗化了,此时在Navicat中输入show variables like 'char%'

数据库到java 乱码 数据库乱码问题_中文字符_13


发现在CMD中显示的UTF8不同,这里是latin1,使用SET NAMES UTF8再查看一次

数据库到java 乱码 数据库乱码问题_数据库到java 乱码_14


以为万事大吉,重新插入一条记录,读取依旧乱码,原因可能是Navicat的字符集无法修改,因为我重新启动了一次发现没有变化。

最后无奈,将编码方式从UTF-8改为自动,使用SET NAMES UTF8再查看一次

数据库到java 乱码 数据库乱码问题_数据库_15


此时能够正常显示插入的中文,我不理解为什么,不信邪,又重新安装了一次,但是还是用UTF-8编码却实际是latin1,弄了一天最后还是只能用自动来解决,具体原因目前依旧没有得到解释,希望有懂哥看到了能教我一下。