使用 docker-compose 启动 MySQL 的问题记录

问题

在工作中使用 docker-compose 来启动 MySQL 容器时,由于没有配置字符集,出现以下问题:

  • 数据库里的中文记录在网页上无法正常显示,全部是乱码。
  • 修改配置文件后,在容器中打开 MySQL 终端后,修改记录时无法输入中文。

这是原来的 docker-compose.yaml 文件:

version: "2"

services:
  mysql:
    container_name: mysql-name
    image: mysql
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "127.0.0.1:3308:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=000000
    restart: always

解决过程

以交互模式进入容器:

docker exec -it containerName sh

进入 MySQL 终端:

mysql -u userName -p

选择数据库后,执行下面的命令查看字符集情况, 发现基本都是 latin1:

SHOW VARIABLES LIKE 'character_set_%';

SHOW VARIABLES LIKE 'collation_%';

参考网上的教程修改:

# 解决外部访问数据乱码问题
SET NAMES 'utf8';

# 上面这条命令相当于下面的三条命令
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

# 如果已经建立了数据库,可以通过以下语句修改字符集
alter database name character set utf8; # 修改数据库
alter table type character set utf8; # 修改表
alter table type modify type_name varchar(50) CHARACTER SET utf8; # 修改字段

# 修改配置文件,进入容器后找到:etc/mysql/mysql.conf.d/mysqld.cnf
[mysql]
default-character-set = utf8

[mysql.server]
default-character-set = utf8
 
[mysqld_safe]
default-character-set = utf8
 
[client]
default-character-set = utf8
 
[mysqld]
default-character-set = utf8
character_set_server = utf8 

执行以上命令后,再查看字符集,发现大部分都修改为 utf-8 了,在网页端的中文也能正常显示了。

如果想要在 MySQL 终端中能够输入中文,还需要按下面的方式进入终端:

LANG=C.UTF-8 mysql -u username -p

新的问题

在停止容器后再启动时,出现容器一直处于 restarting 状态的情况,执行这条命令来查看指定容器日志:

docker logs --tail 50 --follow --timestamps containerName

发现错误:unknown variable 'default-character-set=utf8'

这时因为无法进入容器来修改 MySQL 的配置文件,只能先删除容器。

修改配置文件:新添加的内容中,删除 [mysqld] 标签下的 default-character-set=utf8 ,保留 character_set_server=utf8 ,删除其它标签及内容。

[mysqld]
character_set_server = utf8 

通过挂载 volume 的方式来使用自定义的配置文件,修改好后的 docker-compose.yaml 文件:

version: "2"

services:
  mysql:
    container_name: mysql-name
    image: mysql
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/mysql.conf.d
    ports:
      - "127.0.0.1:3308:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=000000
      - LANG=C.UTF-8
    restart: always

一个 docker-compose.yaml 中可能有多个服务,可以通过这条命令来启动指定服务:

docker-compose up -d mysql

这时再查看字符集,除了 character_set_filesystem 外已全部是 utf-8,进入终端时不指定 LANG 也能输入中文。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前段时间公司内部博客上凯哥分享了一篇关于mysql字符集编码的文章,之前我对mysql字符集一块基本没有深究过,看...
    __七把刀__阅读 6,527评论 14 18
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,185评论 0 13
  • 参考书目:《爱情数学》[英] 汉娜·弗莱 不把男神当男神,对方才会平视你。憧憬是离爱情最遥远的距离。因为仰视,无法...
    甘小莱阅读 786评论 0 0
  • 天生对大海有着深厚的感情,看见大海就莫名的兴奋。难道是因为女人真是水做的,也许是因为我内心向往宽广大度的境界。 还...
    夏天Molly阅读 494评论 5 4