修改Docker MySQL官方鏡像字符集UTF8

通過MySQL提供的官方鏡像啓動MySQL

docker run -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=toor -d mysql:5.7

參數

  • -d 開啓 deamon模式
  • -p port 映射端口內部本地3306到容器的3306
  • -e environment 設置密碼 toor

編碼問題

採用默認的 MySQL Docker 官方鏡像啓動的MySQL字符編碼都是latin1:
默認編碼

解決辦法

方法一:添加啓動命令

docker run -e MYSQL_ROOT_PASSWORD=toor -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

但是很遺憾,我這裏添加這兩個命令後仍然沒有能完全奏效:
字符編碼

方法二:修改my.cnf

這裏有一個比較難受的地方,你可以通過docker exec -it {容器ID} /bin/bash 進入到容器中,修改my.cnf進行相關配置的修改。

但是,my.cnf修改完成後必須要重啓MySQL,然而MySQL官方的docker鏡像是以mysql進程爲deamon的,MySQL一旦停止,這個Docker 容器會立馬掛掉。再次啓動,則又是以前的配置。

因此只能基於MySQL的官方鏡像,重新構建一個加載了字符編碼配置的鏡像。

這裏我們使用dockerfile

一、首先,編寫一個配置文件
vi my.cnf
# 輸入以下內容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server=utf8_general_ci
character-set-server=utf8
init-connect='SET NAMES utf8'

# 保存退出
:wq
二、編寫Dockerfile
vi Dockerfile
# 輸入以下內容:
from mysql:5.7
COPY my.cnf /etc/mysql/conf.d/mysqlutf8.cnf
CMD ["mysqld", "--character-set-server=utf8", "--collation-server=utf8_unicode_ci"]
三、通過Dockerfile構建Docker鏡像
docker build -t mysqlutf8 .

注意最後一個 . 別忘了

四、通過剛構建出的鏡像啓動MySQL
docker run -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=toor -d mysqlutf8:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

啓動後再進入MySQL查看字符集
字符編碼

其他

這裏的utf8mb4utf8差別不大。因爲一些歷史遺留問題,導致mysql當中的utf8並不是通用標準的utf8,在極少數情況下會出現編碼不統一的問題 utf8mb4纔是MySQL中提供的通用utf8編碼標準,嚴謹起見,建議在MySQL中統一設置爲utf8mb4

參考資料

  1. http://xy.uyun.cn/post/1631.html
  2. https://www.linyuting.cn/gerenrizhi/docker-charset-utf8.html
  3. https://github.com/ibusybox/mysqlutf8
  4. https://github.com/dnhsoft/docker-mysql-utf8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章