Docker Compose 部署 MySQL 中文乱码避坑指南

 更新时间:2026年05月26日 08:32:30   作者:PythonAI实战君  
本文主要介绍了Docker Compose 部署 MySQL 中文乱码避坑指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

基于 RuoYi-Vue + MySQL 8.0 Docker 部署踩坑实录

问题现象

使用 Docker Compose 部署若依后台管理系统时,遇到以下中文乱码问题:

  1. Navicat 查询中文乱码:数据库表中的中文字段显示为乱码(如 若依科技
  2. 系统菜单接口返回乱码:前端页面菜单名称、部门名称等中文内容显示异常
  3. 后端日志中的中文也是乱码

根本原因

MySQL 官方 Docker 镜像在执行 /docker-entrypoint-initdb.d/*.sql 初始化脚本时,默认使用 latin1 客户端字符集,导致 UTF-8 编码的 SQL 文件被错误解析。

即使你在 docker-compose.yml 中配置了:

command: >
  --character-set-server=utf8mb4
  --collation-server=utf8mb4_unicode_ci

这些参数只影响 MySQL Server 运行时的字符集,不影响 entrypoint 执行初始化脚本时的客户端字符集

踩坑过程

坑 1:以为配置了 server 字符集就万事大吉

# 错误示范 ❌
command: >
  --character-set-server=utf8mb4
  --collation-server=utf8mb4_unicode_ci

结果:

  • SHOW VARIABLES LIKE 'character_set_server'; → utf8mb4 ✅
  • 但初始化后的数据仍然是乱码 ❌

坑 2:SQL 文件开头加SET NAMES utf8mb4

-- 无效 ❌
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;

结果:entrypoint 执行 SQL 时,第一个连接就已经是 latin1,SET NAMES 只能修复后续语句,但前面的数据已经写入乱码。

坑 3:挂载 my.cnf 配置文件

volumes:
  - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf

结果:

World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.

Windows 挂载到 Docker 后文件权限变成 777,MySQL 出于安全考虑直接忽略该配置。

坑 4:使用--skip-character-set-client-handshake

command: >
  --skip-character-set-client-handshake

结果:这个参数确实能让客户端强制使用 server 字符集,但 entrypoint 执行初始化脚本时可能尚未生效,导致初始化数据仍然乱码。

正确解决方案

方案:Shell 脚本包装器(推荐)

创建 00-init-database.sh,显式指定 --default-character-set=utf8mb4 执行 SQL:

#!/bin/bash
set -e
# 使用 utf8mb4 字符集执行初始化 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`;
-- 建表 + 插入数据...

关键点:

  1. .sh 脚本在 .sql 之前执行(按文件名排序)
  2. mysql 命令显式指定 --default-character-set=utf8mb4
  3. 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"

目录结构

docker/mysql/init/
├── 00-init-database.sh    # Shell 包装器(关键!)
└── 01-init.sql            # 数据库初始化 SQL

验证方法

1. 检查 MySQL 字符集

docker exec ruoyi-mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set%';"

期望结果:

+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
+--------------------------+---------+

2. 检查数据是否正确

docker exec ruoyi-mysql sh -c 'mysql -uroot -p -e "SELECT dept_name FROM \`ry-vue\`.sys_dept WHERE dept_id=100;"'

期望结果:

dept_name
若依科技

3. Navicat 连接设置

  • 编码:选择 Auto 或 utf8mb4
  • 高级 → 编码:65001 (UTF-8)

总结

方案效果原因
--character-set-server=utf8mb4❌ 无效只影响 server,不影响初始化客户端
SQL 中加 SET NAMES utf8mb4❌ 无效执行时已用 latin1 连接
挂载 my.cnf❌ 无效Windows 权限问题被忽略
--skip-character-set-client-handshake⚠️ 不稳定entrypoint 执行时机不确定
Shell 脚本 + --default-character-set=utf8mb4✅ 有效直接控制初始化连接的字符集

一句话总结

Docker 部署 MySQL 时,初始化 SQL 一定要用 Shell 脚本包装,显式指定 --default-character-set=utf8mb4,否则中文必乱码!

到此这篇关于Docker Compose 部署 MySQL 中文乱码避坑指南的文章就介绍到这了,更多相关Docker Compose 部署 MySQL 中文乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker 部署 时序数据库TDengine的思路详解

    docker 部署 时序数据库TDengine的思路详解

    TDengineGUI是一个基于electron构建的,针对时序数据库TDengine的图形化管理工具,这篇文章主要介绍了docker 部署 时序数据库TDengine的思路详解,需要的朋友可以参考下
    2025-04-04
  • 如何为Go程序创建一个最小的Docker Image详解

    如何为Go程序创建一个最小的Docker Image详解

    这篇文章主要给大家介绍了关于如何为Go程序创建一个最小的Docker Image的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • docker实现ES+Kibana方式

    docker实现ES+Kibana方式

    这篇文章主要介绍了docker实现ES+Kibana方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • Centos 7中Docker私有仓库的搭建方法

    Centos 7中Docker私有仓库的搭建方法

    本篇文章主要介绍了Centos 7中Docker私有仓库的搭建方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • docker打包本地conda虚拟环境并远程部署的详细过程

    docker打包本地conda虚拟环境并远程部署的详细过程

    这篇文章给大家介绍docker打包本地conda虚拟环境并远程部署的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-03-03
  • 部署k8s和docker、jenkins的区别和联系详析

    部署k8s和docker、jenkins的区别和联系详析

    Jenkins、Docker与Kubernetes是现代软件开发和运维中不可或缺的核心工具,它们分别承担不同层次的关键角色,这篇文章主要介绍了部署k8s和docker、jenkins的区别和联系的相关资料,需要的朋友可以参考下
    2025-11-11
  • docker指令收集整理(收藏)

    docker指令收集整理(收藏)

    Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,源代码托管在 Github 上, 遵从Apache2.0协议开源。这篇文章主要介绍了docker指令收集整理(收藏),需要的朋友可以参考下
    2017-02-02
  • Flask应用封装成Docker服务的完整操作指南

    Flask应用封装成Docker服务的完整操作指南

    本文详细介绍了如何使用Docker将Flask应用容器化,包括实现原理、详细操作步骤、进阶配置、常见问题及解决方案和生产环境注意事项,需要的朋友可以参考下
    2025-04-04
  • 使用Grafana 展示Docker容器的监控图表并设置邮件报警规则(图解)

    使用Grafana 展示Docker容器的监控图表并设置邮件报警规则(图解)

    这篇文章主要介绍了使用Grafana 展示Docker容器的监控图表并设置邮件报警规则的图文教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-01-01
  • 2025最新Docker国内可用镜像源仓库地址分享

    2025最新Docker国内可用镜像源仓库地址分享

    在使用Docker时,您是否经常遇到拉取镜像缓慢或下载中断的问题?特别是对于我们在国内的开发者,网络条件限制常常导致镜像下载速度令人头疼,为了让您的开发工作更加顺畅,小编特意收集并整理了2025年最新、可用的国内Docker镜像源地址,希望能大幅提升您的Docker下载速度
    2025-02-02

最新评论