专栏首页运维录为什么Docker创建的MySQL容器字符乱码?

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

《复仇者联盟4:终局之战》钢铁侠打响指后,灭霸军团湮灭。

问题描述


这篇文章发布于 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/ |
+--------------------------+----------------------------+

小结


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

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

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

欢迎加入QQ群: 703906133

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

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用shell 批量更改 mysql字符集

    这里还有一个mysql字符乱码的例子,部署redmine过程中,mysql数据库使用了默认的字符集,导致含有中文内容为乱码。

    用户1560186
  • ​ mysql编译安装脚本

    这篇文章发布于 2015年,内容是介绍使用源码方式编译安装 mysql-5.6 ,时间回到 2015年,那时候 Docker还在蓄能阶段没有全面爆发。

    用户1560186
  • ​mysql show processlist

    功能: 列出正在运行的线程以及这些线程的状态,这对了解客户端执行那些操作很有帮助。

    用户1560186
  • mysql字符集配置&mysql中文乱码

    这两天重置了下自己的电脑系统,一个ubuntu,另外一个当然就是windows。 不过在运行程序的时候发现,出现了很多的“????”,也就是乱码字符。毫无疑...

    roobtyan
  • 彻底解决MySQL中文乱码

    mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。

    Java团长
  • Ubuntu16.04中MySQL5.7设置UTF-8编码

    今天遇到了一个奇葩的问题 呃呃,难受,在使用mysql创建表的时候就是输入中文就报错,后来一看mysql的编码格式,吓我一跳,从没有用过的格式:latin1这个...

    Debug客栈
  • [原创]Gerrit中文乱码问题解决方案分享

    应开发同事的要求,部署了Gitlab+Gerrit+Jenkins的持续集成环境. 但是发现了一个问题,Gerrit登陆后有中文乱码出现. 具体情况如下: (1...

    洗尽了浮华
  • mysql事务

    ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeata...

    东营浪人
  • Mysql设置UTF-8字符集

    [windows下安装mysql及设置字符集]http://blog.csdn.net/dream_an/article/details/51058710

    王小雷
  • ubuntu下安装qt 的mysql 驱动遇到的问题

    参照网上教程,做的过程遇到很多问题,记下. 1.首先我将软件中心搜到的mysql server和客户端都装上了. 2.sudo apt-get install ...

    s1mba

扫码关注云+社区

领取腾讯云代金券