Docker Compose 部署 MySQL 中文亂碼避坑指南
基于 RuoYi-Vue + MySQL 8.0 Docker 部署踩坑實錄
問題現(xiàn)象
使用 Docker Compose 部署若依后臺管理系統(tǒng)時,遇到以下中文亂碼問題:
- Navicat 查詢中文亂碼:數(shù)據(jù)庫表中的中文字段顯示為亂碼(如
è‹¥ä¾?科技) - 系統(tǒng)菜單接口返回亂碼:前端頁面菜單名稱、部門名稱等中文內(nèi)容顯示異常
- 后端日志中的中文也是亂碼


根本原因
MySQL 官方 Docker 鏡像在執(zhí)行 /docker-entrypoint-initdb.d/*.sql 初始化腳本時,默認使用 latin1 客戶端字符集,導(dǎo)致 UTF-8 編碼的 SQL 文件被錯誤解析。
即使你在 docker-compose.yml 中配置了:
command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
這些參數(shù)只影響 MySQL Server 運行時的字符集,不影響 entrypoint 執(zhí)行初始化腳本時的客戶端字符集。
踩坑過程
坑 1:以為配置了 server 字符集就萬事大吉
# 錯誤示范 ? command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
結(jié)果:
- SHOW VARIABLES LIKE 'character_set_server'; → utf8mb4 ?
- 但初始化后的數(shù)據(jù)仍然是亂碼 ?
坑 2:SQL 文件開頭加SET NAMES utf8mb4
-- 無效 ? SET NAMES utf8mb4; SET CHARACTER SET utf8mb4;
結(jié)果:entrypoint 執(zhí)行 SQL 時,第一個連接就已經(jīng)是 latin1,SET NAMES 只能修復(fù)后續(xù)語句,但前面的數(shù)據(jù)已經(jīng)寫入亂碼。
坑 3:掛載 my.cnf 配置文件
volumes: - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
結(jié)果:
World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
Windows 掛載到 Docker 后文件權(quán)限變成 777,MySQL 出于安全考慮直接忽略該配置。
坑 4:使用--skip-character-set-client-handshake
command: > --skip-character-set-client-handshake
結(jié)果:這個參數(shù)確實能讓客戶端強制使用 server 字符集,但 entrypoint 執(zhí)行初始化腳本時可能尚未生效,導(dǎo)致初始化數(shù)據(jù)仍然亂碼。
正確解決方案
方案:Shell 腳本包裝器(推薦)
創(chuàng)建 00-init-database.sh,顯式指定 --default-character-set=utf8mb4 執(zhí)行 SQL:
#!/bin/bash set -e # 使用 utf8mb4 字符集執(zhí)行初始化 SQL mysql -uroot -p"$MYSQL_ROOT_PASSWORD" --default-character-set=utf8mb4 < /docker-entrypoint-initdb.d/01-init.sql
SQL 文件(01-init.sql):
USE `ry-vue`; -- 建表 + 插入數(shù)據(jù)...
關(guān)鍵點:
- .sh 腳本在 .sql 之前執(zhí)行(按文件名排序)
- mysql 命令顯式指定 --default-character-set=utf8mb4
- SQL 文件中包含 USE db_name;
完整 docker-compose.yml 配置
services:
mysql:
image: docker.1ms.run/mysql:8.0
container_name: ruoyi-mysql
environment:
MYSQL_ROOT_PASSWORD: ruoyi123456
MYSQL_DATABASE: ry-vue
TZ: Asia/Shanghai
command: >
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--default-time-zone=+08:00
volumes:
- ./mysql_data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
ports:
- "3306:3306"目錄結(jié)構(gòu)
docker/mysql/init/ ├── 00-init-database.sh # Shell 包裝器(關(guān)鍵!) └── 01-init.sql # 數(shù)據(jù)庫初始化 SQL
驗證方法
1. 檢查 MySQL 字符集
docker exec ruoyi-mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set%';"
期望結(jié)果:
+--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | +--------------------------+---------+
2. 檢查數(shù)據(jù)是否正確
docker exec ruoyi-mysql sh -c 'mysql -uroot -p -e "SELECT dept_name FROM \`ry-vue\`.sys_dept WHERE dept_id=100;"'
期望結(jié)果:
dept_name 若依科技
3. Navicat 連接設(shè)置
- 編碼:選擇 Auto 或 utf8mb4
- 高級 → 編碼:65001 (UTF-8)
總結(jié)
| 方案 | 效果 | 原因 |
|---|---|---|
| --character-set-server=utf8mb4 | ? 無效 | 只影響 server,不影響初始化客戶端 |
| SQL 中加 SET NAMES utf8mb4 | ? 無效 | 執(zhí)行時已用 latin1 連接 |
| 掛載 my.cnf | ? 無效 | Windows 權(quán)限問題被忽略 |
| --skip-character-set-client-handshake | ?? 不穩(wěn)定 | entrypoint 執(zhí)行時機不確定 |
| Shell 腳本 + --default-character-set=utf8mb4 | ? 有效 | 直接控制初始化連接的字符集 |
一句話總結(jié)
Docker 部署 MySQL 時,初始化 SQL 一定要用 Shell 腳本包裝,顯式指定 --default-character-set=utf8mb4,否則中文必亂碼!
到此這篇關(guān)于Docker Compose 部署 MySQL 中文亂碼避坑指南的文章就介紹到這了,更多相關(guān)Docker Compose 部署 MySQL 中文亂碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker?部署?時序數(shù)據(jù)庫TDengine的思路詳解
TDengineGUI是一個基于electron構(gòu)建的,針對時序數(shù)據(jù)庫TDengine的圖形化管理工具,這篇文章主要介紹了docker?部署?時序數(shù)據(jù)庫TDengine的思路詳解,需要的朋友可以參考下2025-04-04
如何為Go程序創(chuàng)建一個最小的Docker Image詳解
這篇文章主要給大家介紹了關(guān)于如何為Go程序創(chuàng)建一個最小的Docker Image的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
docker打包本地conda虛擬環(huán)境并遠程部署的詳細過程
這篇文章給大家介紹docker打包本地conda虛擬環(huán)境并遠程部署的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2026-03-03
部署k8s和docker、jenkins的區(qū)別和聯(lián)系詳析
Jenkins、Docker與Kubernetes是現(xiàn)代軟件開發(fā)和運維中不可或缺的核心工具,它們分別承擔(dān)不同層次的關(guān)鍵角色,這篇文章主要介紹了部署k8s和docker、jenkins的區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下2025-11-11
Flask應(yīng)用封裝成Docker服務(wù)的完整操作指南
本文詳細介紹了如何使用Docker將Flask應(yīng)用容器化,包括實現(xiàn)原理、詳細操作步驟、進階配置、常見問題及解決方案和生產(chǎn)環(huán)境注意事項,需要的朋友可以參考下2025-04-04
使用Grafana 展示Docker容器的監(jiān)控圖表并設(shè)置郵件報警規(guī)則(圖解)
這篇文章主要介紹了使用Grafana 展示Docker容器的監(jiān)控圖表并設(shè)置郵件報警規(guī)則的圖文教程,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-01-01
2025最新Docker國內(nèi)可用鏡像源倉庫地址分享
在使用Docker時,您是否經(jīng)常遇到拉取鏡像緩慢或下載中斷的問題?特別是對于我們在國內(nèi)的開發(fā)者,網(wǎng)絡(luò)條件限制常常導(dǎo)致鏡像下載速度令人頭疼,為了讓您的開發(fā)工作更加順暢,小編特意收集并整理了2025年最新、可用的國內(nèi)Docker鏡像源地址,希望能大幅提升您的Docker下載速度2025-02-02

