0%

修改 Docker 和 docker-compose 下 MySQL 的默认字符集

docker 中 MySQL 的默认编码为 latin1,这会导致中文乱码,因此我们需要修改 MySQL 的默认字符集。

我们可以通过以下几种方式来修改 MySQL 的默认字符集。

修改配置文件

我们可以通过修改配置文件的形式,来改变字符集。

1
2
3
4
5
6
7
8
9
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4

修改 docker 启动命令

我们也可以通过修改 docker 命令来实现:

1
docker run mysql --name mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake

修改 docker-compose 配置文件

如果使用了 docker-compose,那么可以这样:

1
2
3
4
mysql:
image: mysql:5.7
container_name: mysql
command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--skip-character-set-client-handshake']

附言

特别地,我们来解释下 skip-character-set-client-handshake 命令的作用。

我们可以看下 MySQL 官方手册的如下片段:

--character-set-client-handshake

Property Value
Command-Line Format `–character-set-client-handshake[={OFF
Type Boolean
Default Value ON

Do not ignore character set information sent by the client. To ignore client information and use the default server character set, use --skip-character-set-client-handshake; this makes MySQL behave like MySQL 4.0.

也就是说在默认情况下,MySQL 客户端是使用客户端设置的编码的。可以通过 --skip-character-set-client-handshake 来让客户端使用服务端的编码,来保持编码的一致性。因为我们 docker 里边多数情况下都是连接 docker 里边的 MySQL 服务,所以设置 --skip-character-set-client-handshake 是非常合理的一个情况,这样便不必单独再去设置客户端编码。