记一次诡异的Mysql数据库查询中文乱码

问题描述

最近老系统重构,老系统数据库数据需要迁移到新系统数据库中,迁移后出现了Java项目查询数据中文乱码的问题。

老系统数据库版本为8,编码为utf8;新系统数据库版本为5.7,编码为utf8mb4。因为新系统数据库不允许外网访问,所以首先登陆老系统数据库,导出sql文件,然后登陆新系统内网服务器,上传sql文件,通过mysql客户端连接新系统数据库,导入sql文件。

分析解决步骤

①最开始想到的可能是数据问题,windows系统打开sql文件,发现文件编码和数据均正常。通过新系统数据库客户端执行select语句查询出数据,发现中文正常显示,所以最开始就排除了数据的问题。

②然后想到可能是Java客户端这边编码设置问题,所以修改Java项目数据库的连接字符串的编码,但是并不能解决问题。

③怀疑是驱动版本问题,所以更换了MySQL数据库驱动,然而依然不能解决问题。

④初步排除了Java客户端这边的问题,然后想到可能是新数据库编码没有设置好,所以又登陆内网服务器连上了新数据库,查询数据库编码如下:

所以我初步锁定了是数据库这边的问题,但是我分配的是普通用户账号,并没有权限修改全局的编码,全局编码修改不被允许。所以我决定在JAVA代码中,每次连接创建的时候,临时修改编码。

此方法需要配置数据源的连接初始化sql,所以又将数据源改成了dbcp2,配置连接初始化sql为setnamesutf8mb4(

相当于:

setcharacter_set_client=gb;

setcharacter_set_connection=gb;

setcharacter_set_results=gb;)。

原因如下:

SpringBoot1默认使用的连接池是tomcat数据源,SpringBoot2默认使用的连接池是hikari数据源。

SpringBoot会根据依赖存在与否按优先级选择数据源。以SpringBoot2为例来说就是,找到hikari数据源则使用hikari,否则查找tomcat数据源、如果tomcat不存在、就查找dbcp2数据源。

Hikari数据源class


转载请注明:http://www.aierlanlan.com/rzdk/5424.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了