一、问题现象

在一个技术讨论群碰到一个有趣的故障,正好闲的没事,帮助小白排查一下。

前端页面返回的后台数据乱码,如下所示:

二、排查思路

像这种乱码问题,排查思路还是很好处理。

locale看下服务器的编码和数据库的编码就行了,这里要注意的是,不能只看 mysql 数据库和编码,还要看character_set_client

character_set_connection

character_set_results 的编码。

SHOW VARIABLES LIKE 'character_set%';

SHOW VARIABLES LIKE 'collation%';

如果还是不行,那就 java -Dfile.encoding=UTF-8 指定编码试试看

如果还是不行,那可能是服务器少了中文字体导致的。去网上下载常见的中文编码然后放到/usr/share/fonts 目录下,然后fc-cache -fv 刷下缓存,fc-list 看看有没有加载进来,需要重启下服务。

三、解决方案

SHOW VARIABLES LIKE 'character_set%';

SHOW VARIABLES LIKE 'collation%';

这个问题就很明显了,latin1 不支持中文编码,改下数据库配置文件,然后重启一下。不过之前导入的数据可能就已经是乱码了,需要重新再导入一遍。

为什么说这个故障很有趣呢?因为这个小白从头到尾给我的信息都是错的,最后误导我去排查 nginx 的问题,理论上不应该是 nginx 的系统中文字体的问题,最后让他都试试看,最后还是不行才让他给我看数据库的编码。