跳转至

Mysql容器设置字符集


2016-11-03 by dongnan

问题描述

使用 docker 创建一个 mysql容器实例,发现在某些场景下会遇到查询结果乱码。 这是因为创建的 mysql容器默认使用 latin1字符集,为了修正乱码问题需要设置 utf8 字符集。

环境描述

当前字符集

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)

软件版本

容器镜像: mysql:5.7
容器系统: debian 8 (jessie)
Docker主机: Ubuntu Server 16.04

解决方法

mysql 提供了一些环境变量和配置项目用于调整 mysql容器实例的配置参数。 要解决上述问题,可以在创建容器时指定mysql实例使用的字符集选项。

创建 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

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

获得容器IP地址

docker inspect --format 'pw_ .NetworkSettings.IPAddress ' mysql-server
172.17.0.2

验证字符集

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/ |
+--------------------------+----------------------------+

小结

最后来总结下文章中的知识点

  • 通过设置 mysql容器环境变量,创建数据库、设置账户与密码等信息。
  • 通过设置--character-set-server配置项设置默认字符集。
  • 更多的 mysql 配置项目可以通过以下命令获得:docker run -it --rm mysql:5.7 --verbose --help

参考

mysql容器环境变

回到页面顶部