最近在学习使用Docker,在部署MySQL容器时遇到了乱码问题。
检查了一下发现编码集出了问题
mysql> status
--------------
mysql Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 9
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.27 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 6 min 29 sec
我第一时间是去查DockerHub上的MySQL的官方文档
官方文档https://hub.docker.com/_/mysql
找到了两种办法
1、创建容器的时候按照这种格式指定字符集
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-connection=utf8 --character-set-client=utf8
尝试后还是存在乱码问题
2、挂载配置文件
[client]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
character-set-connection=utf8
character-set-client=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
symbolic-links=0
[mysql]
default-character-set = utf8
也还是不行,想了想这两种方式好像并没有本质上上的区别
焦头烂额一段时候后,我换了一种思路,从容器出发
查看了一下容器的字符集
# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
果然有问题
于是指定了一下容器的字符集
在Dockerfile中家里一句
ENV LANG="en_US.UTF-8"
完美解决,只需要在Dockerfile中加一行配置。
这就是告诉了我,遇到问题换个思路也许能有意想不到的收获