前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么Docker创建的MySQL容器字符乱码?

为什么Docker创建的MySQL容器字符乱码?

作者头像
用户1560186
发布2020-01-15 16:05:50
2.6K0
发布2020-01-15 16:05:50
举报
文章被收录于专栏:运维录运维录
《复仇者联盟4:终局之战》钢铁侠打响指后,灭霸军团湮灭。
问题描述

这篇文章发布于 2016.11.03 ,记录如何解决 mysql容器查询结果乱码的问题。

使用 docker 创建一个 mysql容器实例,发现在某些场景下会遇到查询结果乱码

这是因为创建的 mysql容器默认使用 latin1字符集,为了修正乱码问题需要设置 utf8 字符集。

环境描述

1. 当前字符集

代码语言:javascript
复制
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. 版本

代码语言:javascript
复制
容器镜像: mysql:5.7
容器系统: debian 8 (jessie)
Docker主机: Ubuntu Server 16.04
解决方法

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

1. 创建 mysql容器

代码语言:javascript
复制
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 变量&参数

代码语言:javascript
复制
'环境变量':
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地址

代码语言:javascript
复制
docker inspect --format '{{ .NetworkSettings.IPAddress }}' mysql-server

172.17.0.2

4. 验证字符集

代码语言:javascript
复制
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容器环境变量,创建数据库、设置账户与密码等信息。 更多 mysql容器环境变量请参考: https://hub.docker.com/_/mysql/
  • 通过设置--character-set-server配置项设置默认字符集。 更多mysql配置项通过命令获得:docker run -it --rm mysql:5.7 --verbose --help

公众号回复 docker 获得文章专题

欢迎加入QQ群: 703906133

欢迎关注微信公众号: 运维录

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 《复仇者联盟4:终局之战》钢铁侠打响指后,灭霸军团湮灭。
  • 问题描述
  • 环境描述
  • 解决方法
  • 小结
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档