记一次docker-mysql5.7乱码的完整解决过程及原因分析

        先说下背景,最近有一个项目,客户要求所有东西都使用docker来部署,总共部署了两个docker: docker-tomcat(不限版本,直接摘取最新的,下载后看到是是8.5.49)、docker-mysql(5.7.18)。

        按常规,当然是先在测试环境部署测试,在阿里云服务器上搭建两个docker, 并使用Navicat 连接到docker-mysql进行数据库初始化,完成后打开页面,一切正常,完美!

        然后,项目上线,由于客户服务器外网不通,所以将初始化的Sql脚本上传到服务器,再通过服务器终端使用source命令进行初始化。部署完成后,打开页面,乱码!!!乱码!!!,只要是从数据库查询出来的数据都是乱码~

       原因分析:这是因为数据库没有设置编码导致,有人又问那为什么测试环境没有问题呢?因为测试环境是通过Navicat来操作的,Navicat自带编码!

        下面有图为证:

         一是进入容器,登录mysql,执行show variables like 'char%';查看数据库编码如下

记一次docker-mysql5.7乱码的完整解决过程及原因分析

二是直接使用navicat连接,执行show variables like 'char%'查看,如下

记一次docker-mysql5.7乱码的完整解决过程及原因分析

由些可见,navicat是自带编码,所以测试环境通过navicat来初始化没有出现乱码。

 

解决过程

一、设置mysql编码

参考https://blog.csdn.net/u011142756/article/details/81712461

修改字MySQL字符集    vim  mysql/conf/my.cnf

添加下面代码:

[client]

default-character-set=utf8

 

[mysql]

default-character-set=utf8

 

[mysqld]

init_connect='SET collation_connection = utf8_unicode_ci'

init_connect='SET NAMES utf8'

character-set-server=utf8

collation-server=utf8_unicode_ci

skip-character-set-client-handshake

重启后,再进入容器,使用mysql -u root -p登录查看编码,可看到编码已经生效

mysql> show variables like'character%';
+--------------------------+----------------------------+
| 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)

 

二、重新初始化数据库

由于之前初始化数据库时并没有设置编码,所以初始化的数据已经是乱码,可以查询表数据查看情况 ,如图

记一次docker-mysql5.7乱码的完整解决过程及原因分析

将数据库删除,然后重新初始化后,一切正常,至此docker-mysql乱码解决。