問(wèn)題
在工作中使用 docker-compose 來(lái)啟動(dòng) MySQL 容器時(shí)应役,由于沒(méi)有配置字符集捺疼,出現(xiàn)以下問(wèn)題:
- 數(shù)據(jù)庫(kù)里的中文記錄在網(wǎng)頁(yè)上無(wú)法正常顯示,全部是亂碼屏鳍。
- 修改配置文件后溉仑,在容器中打開(kāi) MySQL 終端后挖函,修改記錄時(shí)無(wú)法輸入中文。
這是原來(lái)的 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
解決過(guò)程
以交互模式進(jìn)入容器:
docker exec -it containerName sh
進(jìn)入 MySQL 終端:
mysql -u userName -p
選擇數(shù)據(jù)庫(kù)后浊竟,執(zhí)行下面的命令查看字符集情況挪圾, 發(fā)現(xiàn)基本都是 latin1:
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
參考網(wǎng)上的教程修改:
# 解決外部訪問(wèn)數(shù)據(jù)亂碼問(wèn)題
SET NAMES 'utf8';
# 上面這條命令相當(dāng)于下面的三條命令
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
# 如果已經(jīng)建立了數(shù)據(jù)庫(kù),可以通過(guò)以下語(yǔ)句修改字符集
alter database name character set utf8; # 修改數(shù)據(jù)庫(kù)
alter table type character set utf8; # 修改表
alter table type modify type_name varchar(50) CHARACTER SET utf8; # 修改字段
# 修改配置文件逐沙,進(jìn)入容器后找到: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
執(zhí)行以上命令后哲思,再查看字符集,發(fā)現(xiàn)大部分都修改為 utf-8 了吩案,在網(wǎng)頁(yè)端的中文也能正常顯示了棚赔。
如果想要在 MySQL 終端中能夠輸入中文,還需要按下面的方式進(jìn)入終端:
LANG=C.UTF-8 mysql -u username -p
新的問(wèn)題
在停止容器后再啟動(dòng)時(shí)徘郭,出現(xiàn)容器一直處于 restarting 狀態(tài)的情況靠益,執(zhí)行這條命令來(lái)查看指定容器日志:
docker logs --tail 50 --follow --timestamps containerName
發(fā)現(xiàn)錯(cuò)誤:unknown variable 'default-character-set=utf8'
這時(shí)因?yàn)闊o(wú)法進(jìn)入容器來(lái)修改 MySQL 的配置文件,只能先刪除容器残揉。
修改配置文件:新添加的內(nèi)容中胧后,刪除 [mysqld] 標(biāo)簽下的 default-character-set=utf8
,保留 character_set_server=utf8
抱环,刪除其它標(biāo)簽及內(nèi)容壳快。
[mysqld]
character_set_server = utf8
通過(guò)掛載 volume 的方式來(lái)使用自定義的配置文件,修改好后的 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
一個(gè) docker-compose.yaml 中可能有多個(gè)服務(wù)镇草,可以通過(guò)這條命令來(lái)啟動(dòng)指定服務(wù):
docker-compose up -d mysql
這時(shí)再查看字符集眶痰,除了 character_set_filesystem 外已全部是 utf-8,進(jìn)入終端時(shí)不指定 LANG 也能輸入中文梯啤。