mysql连接端和服务端编码不一致的问题

一.问题描述

由于护网原因,本地开发环境对数据库的连接被关闭。项目部署后,代码中对某一个数据库中文值的判断始终不能匹配(比如数据库中存的是“总部”,代码里面判断的也是“总部”,但就是匹配失败),然后一直报错。打印改对象后发现中文乱码,但是走了点弯路-----因为开发坚持认为部署的服务器没有安装中文包,所有输出乱码。后来发现其实是之前让运维向数据库导数据的时候,编码格式不对导致的。

二.现象及排查思路

  • 1.现象:打印数据库查询对象,发现中文字段乱码。对应的匹配判断也没有生效。
  • 2.排查:很显然,第一反应是排查项目对mysql的连接有没有指定编码格式(utf8),好的其实我用了
url: jdbc:mysql://xx.xx.xx.xx:5106/db-name?useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true
  • 3.会不会是部署所在的服务器没有中文包,导致输出乱码?很明显,也不是,因为我在代码里面直接加了中文匹配。那么最后的可能就是:数据库端本来存的不是utf8.

三.解决问题

  • 1.登录到数据库服务器,查看对应的编码:
show variables like '%character%';

然后不出意外就是下面这样的图了:

mysql master slave数据不一致 mysql编码不一致_客户端

  • 2.想必从图片大家已经看出端倪了吧。
    character_set_client的编码是latin1;而character_set_system是utf8。客户端(本窗口)用的是北欧编码,服务端提供的是utf8编码。
  • 3.进一步探寻,直接查询数据(注意此时客户端编码是latin1),我这边中文没有乱码。然后统一客户端和项目编码保持一致,使用如下命令:
set names utf8;

再执行下show variables like ‘%character%’;就会发现character_set_client的编码变为utf8了

  • 4.接下来,查询返回的结果和项目中的乱码一样。猜想得到证实。
  • 5.处理办法。我这边是手动处理:在mysql客户端中执行set names utf8;然后使用mysql的source命令重新导数据
  • 6.问题得到解决。