美文网首页
使用 docker-compose 启动 MySQL 的问题记录

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

作者: LLLeon | 来源:发表于2018-02-01 21:06 被阅读767次

问题

在工作中使用 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 也能输入中文。

相关文章

网友评论

      本文标题:使用 docker-compose 启动 MySQL 的问题记录

      本文链接:https://www.haomeiwen.com/subject/uxyjzxtx.html