还是最近的这个Java Web项目,在本机运行好好的,一到服务器就出现了中文乱码的问题。虽然感觉很奇怪,但是还是顺着思路一步一步给解决了。解决的思路如下。
查看Java Web项目中接收的中文是否乱码 有一个业务逻辑就是要获取浏览器输入的中文,在处理中文输入的地方加上一句输出语句可以看到日志中记录如下:
1 2 2018-03-28 11:26:33 [INFO] - org.springframework.web.servlet.DispatcherServlet - FrameworkServlet.java(508) - FrameworkServlet 'servlet': initialization completed in 4321 ms [content]: <p style="display:none;">习近平欢迎各国使节来华履新,请他们转达对各有关国家领导人和人民的诚挚问候和美好祝愿,表示中国政府将为各国使节履职提供便利和支持,希望使节们发挥桥梁和纽带作用,为增进中国同各国友谊、推动双边关系发展作出积极贡献。</p>
说明中文输入是没有问题的,问题就出现在了Java Web服务器与MySQL数据库的交互上面,因此现在查找的方向就是MySQL数据库编码情况。
查看MySQL数据库的字符编码情况 在终端打开MySQL数据库:
然后再选择数据库并查看其编码情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 MariaDB [anti_crawler_system]> show variables like "%char%" ; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
很明显可以看到character_set_server
是latin1
编码,估计这个地方就是元凶。
修改my.cnf文件 切换到/etc
目录下,编辑my.cnf
文件,和我一样即可,注意配置添加的顺序哦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [mysqld] character-set-server =utf8datadir =/var/lib/mysqlsocket =/var/lib/mysql/mysql.socksymbolic-links =0 [mysqld_safe] log-error =/var/log/mariadb/mariadb.logpid-file =/var/run/mariadb/mariadb.pid[client] default-character-set =utf8[mysql] default-character-set =utf8
重启MySQL服务器,具体方法见上一篇博客 。然后再次查看编码可以看到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 MariaDB [anti_crawler_system]> show variables like "%char%" ; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
再次查看数据库中的数据,发现一切正常,因此可以看到罪魁祸首的确是这个地方。
总结 关于MySQL数据库修改编码的方式还有很多,但是基本上都是临时修改而已,数据库一旦重新启动则还是原来的编码,因此需要在配置文件中指定好,这样不管重启多少次,都是没有问题的。查找BUG的时候一定要冷静,按照思路一步一步的排查,一定可以找到解决方案的。