问题
在工作中使用 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 也能输入中文。
网友评论