问题描述
最近老系统重构,老系统数据库数据需要迁移到新系统数据库中,迁移后出现了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