这篇文章发布于 2016.11.03
,记录如何解决 mysql
容器查询结果乱码的问题。
使用 docker
创建一个 mysql
容器实例,发现在某些场景下会遇到查询结果乱码。
这是因为创建的 mysql容器默认使用 latin1字符集,为了修正乱码问题需要设置 utf8
字符集。
1. 当前字符集
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
2. 版本
容器镜像: mysql:5.7
容器系统: debian 8 (jessie)
Docker主机: Ubuntu Server 16.04
mysql
提供了一些环境变量和配置项目,用于调整 mysql容器实例的配置参数。要解决上述问题,可以在创建容器时指定mysql
实例使用的字符集选项。
1. 创建 mysql容器
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="password" \
-e MYSQL_ROOT_PASSWORD="password" \
-e TZ=Asia/Chongqing \
-v mysql-data:/var/lib/mysql \
-d mysql:5.7 \
--character-set-server=utf8 \
--collation-server=utf8_general_ci \
--sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
为了持久化数据,使用 -v
选项指定容器的数据卷 mysql-data
。
可以参考《如何使用Docker数据卷?》
2. mysql 变量&参数
'环境变量':
MYSQL_DATABASE # 指定创建的数据库名称
MYSQL_USER # 授权数据库的用户
MYSQL_PASSWORD # 用户密码
MYSQL_ROOT_PASSWORD # mysql 实例 root 用户密码
'配置项目':
`--character-set-server=name` 设置默认字符集。
`--collation-server=name` 设置排序字符集。
`--sql-mode` 配置项用于配置sql模式,不需要可以删除该配置项目。
# 更多的 mysql 配置项目可以通过以下命令获得。
docker run -it --rm mysql:5.7 --verbose --help > var.txt
3. 获得容器IP地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' mysql-server
172.17.0.2
4. 验证字符集
mysql -h 172.17.0.2 -uroot -p -e "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/ |
+--------------------------+----------------------------+
最后来总结下文章中的知识点
https://hub.docker.com/_/mysql/
--character-set-server
配置项设置默认字符集。
更多mysql配置项通过命令获得:docker run -it --rm mysql:5.7 --verbose --help
公众号回复 docker 获得文章专题
欢迎加入QQ群: 703906133
欢迎关注微信公众号: 运维录