Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docker-compose 启动 MySQL 的问题记录 #4

Open
LLLeon opened this issue Feb 1, 2018 · 0 comments
Open

docker-compose 启动 MySQL 的问题记录 #4

LLLeon opened this issue Feb 1, 2018 · 0 comments
Labels
ProblemRecord Problems encountered during development.

Comments

@LLLeon
Copy link
Owner

LLLeon commented Feb 1, 2018

问题

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

@LLLeon LLLeon added the ProblemRecord Problems encountered during development. label Feb 1, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ProblemRecord Problems encountered during development.
Projects
None yet
Development

No branches or pull requests

1 participant