MySQL数据库乱码解决方案

还是最近的这个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
$ mysql -u root -p

然后再选择数据库并查看其编码情况:

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_serverlatin1编码,估计这个地方就是元凶。

修改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=utf8
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

# 这个地方把下面这两行补上即可
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

#
# include all files from the config directory

重启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的时候一定要冷静,按照思路一步一步的排查,一定可以找到解决方案的。

分享到