解决Docker搭建MySQL的中文乱码问题

利用Docker搭建的MySQL,如果不进行额外的设置,默认是不支持在表里插入中文字符的,在实际的生产环境中,这是不允许出现的情况,要解决这个问题,主要的一个核心思想是:在容器中的/etc/mysql/conf.d目录下添加文件my.cnf

提供以下几种方法:

方法一

如果在生成容器时,使用-v 选项指定了容器和主机之间的配置文件的映射,那么直接在主机相应的目录下直接进行操作即可。

比如:

1
docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/log:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=admin --name mysql-1 mysql:latest 

在这个例子中,使用-v 选项将主机/docker/mysql/conf和容器的/etc/mysql/conf.d进行映射,那么直接执行:

1
2
cd /docker/mysql/conf
vim my.cnf

在文件中插入:

1
2
3
4
5
[client]
default_character_set = utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

保存退出后重启容器:

1
docker restart mysql-1

方法二

在生成容器的时候没有进行配置文件目录的映射:

  1. 进入容器:
1
docker exec -it mysql-1 /bin/bash
  1. 下载软件包vim

此时,我们的目的是向/etc/mysql/conf.d目录下添加my.cnf配置文件,但是目前容器中并不存在vim软件包,下载软件包可以参考这篇文章

也可以直接执行下面的命令:

1
2
apt-get update
apt install -y vim
  1. 等待安装完成后
1
2
cd /etc/mysql/conf.d
vim my.cnf

在文件中插入:

1
2
3
4
5
[client]
default_character_set = utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
  1. 重启容器
1
docker restart mysql-1

方法三

  1. 在主机本地编辑文件my.cnf

  2. 插入内容:

1
2
3
4
5
[client]
default_character_set = utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
  1. 拷贝文件至容器
1
docker cp mysql-1 ./my.cnf /etc/mysql/conf.d
  1. 重启容器
1
docker restart mysql-1

检查配置文件是否生效

进入容器,进入数据库,输入:

1
SHOW VARIABLES LIKE 'character%';

回车出现以下,修改成功:

折叠代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | utf8mb3 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | utf8mb3 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)