首页/新闻资讯/正文详情

RuoYi-Vue-Plus Docker 部署踩坑:MySQL 中文双重编码的根因与修复

发布时间:2026/9/26 20:17:25 来源:云帆数科 栏目:资讯中心
RuoYi-Vue-Plus Docker 部署踩坑:MySQL 中文双重编码的根因与修复
现象用 docker-compose 部署完 RuoYi-Vue-Plus 后打开前端页面✅正常按钮文字「新增」「修改」「删除」、表头「角色名称」「权限字符」❌乱码左侧菜单、面包屑、表格中的中文角色名乱码长这样系统管ç†、租户管ç†看到这个 pattern 第一反应是编码问题但问题出在哪一环排查过程Step 1排除 Nginx先看 Nginx 的 Content-Type 头curl -sI http://127.0.0.1:88/ # Content-Type: text/html; charsetutf-8 ✅Nginx 没问题。Step 2排除前端 JS 编码检查编译产物的 UTF-8 字节# 系统 的 UTF-8 应该是 e7 b3 bb xxd /usr/share/nginx/html/assets/index-*.js | grep e7b3 # 找到了UTF-8 字节是正确的前端也没问题。Step 3检查 API 响应原始字节这是关键一步。用 Python 直接读取 API 返回的原始字节import urllib.request # ... login 省略 ... resp urllib.request.urlopen(req) raw resp.read() print(repr(raw[:200]))输出b{meta:{title:\\xc3\\xa7\\xc2\\xb3\\xc2\\xbb...发现问题了正常系统管理的 UTF-8 应该是\xe7\xb3\xbb\xe7\xbb\x9f\xe7\xae\xa1\xe7\x90\x86但实际返回的是\xc3\xa7\xc2\xb3\xc2\xbb\xc3\xa7\xc2\xbb...每个原始 UTF-8 字节前面都多了一个\xc3或\xc2。这就是经典的Mojibake双重编码原始 UTF-8: E7 B3 BB → 系 被当 Latin-1: ç ³ » → 3 个 Latin-1 字符 再 UTF-8 编码: C3 A7 C2 B3 C2 BB → 6 个字节Step 4确认是数据库层的问题直接查 MySQLSELECT menu_name, HEX(menu_name), LENGTH(menu_name), CHAR_LENGTH(menu_name) FROM sys_menu WHERE menu_id 1;-------------------------------------------------------------------------------- | menu_name| HEX(menu_name) | LENGTH | CHAR_LENGTH | -------------------------------------------------------------------------------- | 系统管理 | C3A7C2B3C2BBC3A7C2BBC5B8C3A7C2AEC2A1C3A7... | 25 | 12 | --------------------------------------------------------------------------------CHAR_LENGTH 12MySQL 以为这是 12 个字符实际是 12 个 Latin-1 字符LENGTH 25实际 25 个字节正确的系统管理应该是CHAR_LENGTH 4LENGTH 12HEX 为E7B3BBE7BB9FE7AEA1E79086数据库里存的就是双重编码的数据Step 5定位 MySQL 初始化的 charset 问题检查 MySQL 连接的字符集SHOW SESSION VARIABLES LIKE character_set%;| character_set_client | latin1 | | character_set_connection | latin1 | | character_set_results | latin1 | | character_set_server | utf8mb4 |虽然character_set_server utf8mb4但character_set_client latin1问题链条SQL 文件 (UTF-8: 系统管理 E7B3BB E7BB9F E7AEA1 E79086) ↓ mysql 客户端 (character_set_client latin1) ↓ MySQL 服务器认为输入是 Latin-1按 Latin-1 存储 ↓ 每个 UTF-8 字节被当成独立的 Latin-1 字符 ↓ 存储结果变成双重编码: C3A7C2B3C2BB...为什么--character-set-serverutf8mb4不够你的 docker-compose.yml 可能已经配了mysql: image: mysql:8.0 command: --character-set-serverutf8mb4 --collation-serverutf8mb4_general_ci但这只设置了服务端server的默认字符集。docker-entrypoint-initdb.d执行 SQL 文件时用的是mysql 客户端连接而 mysql 客户端的character_set_client默认取决于操作系统 locale。MySQL 官方 Docker 镜像基于 Oracle Linux / Debian默认 locale 是C或POSIX映射到 MySQL 就是latin1。所以即使你设了--character-set-serverutf8mb4initdb 阶段的 mysql 客户端连接仍然是 latin1。为什么--init-connect也不行你可能试过command: --init-connectSET NAMES utf8mb4--init-connect对root 用户不生效MySQL 安全策略。而docker-entrypoint-initdb.d的 SQL 就是用 root 执行的所以这个配置完全无效。修复方案在每个 SQL 文件的第一行加SET NAMES utf8mb4;SET NAMES utf8mb4; -- ---------------------------- -- 原来的内容... -- ---------------------------- create table sys_social ( ... );然后删除数据卷重新初始化docker compose down -v # 删除数据卷 docker compose up -d # 重新启动重新执行 initdb.d验证SELECT menu_name, HEX(menu_name), CHAR_LENGTH(menu_name) FROM sys_menu WHERE menu_id 1;---------------------------------------------------------- | menu_name| HEX(menu_name) | CHAR_LENGTH | ---------------------------------------------------------- | 系统管理 | E7B3BBE7BB9FE7AEA1E79086 | 4 | ----------------------------------------------------------CHAR_LENGTH 4HEX 是正确的 UTF-8搞定。其他方案对比方案是否有效原因--character-set-serverutf8mb4❌只影响 server 层不影响 client 连接--init-connectSET NAMES utf8mb4❌root 用户不执行 init_connect-e LANGC.UTF-8⚠️ 部分只对 BMP 字符有效emoji 等扩展字符仍有问题[client] default-character-setutf8mb4✅在 my.cnf 里配置但需要挂载自定义配置文件SQL 文件头部加SET NAMES utf8mb4;✅最简单、最可靠不依赖任何外部配置为什么这个问题很难排查静态文字正常Vue 模板里的中文按钮不受影响只有数据库返回的动态数据乱码乱码不是问号不是典型的???或方块而是系统这种看起来像编码问题但又不太确定的字符串server charset 误导SHOW VARIABLES显示character_set_serverutf8mb4让人以为配置没问题SQL 文件本身是 UTF-8用file命令检查 SQL 文件确实是 UTF-8但写入时被 mysql 客户端转码了总结MySQL Docker 镜像的docker-entrypoint-initdb.d机制mysql 客户端默认 charset 是 latin1 而不是 utf8mb4。这是一个从 2016 年就有人报告的问题docker-library/mysql#131、#708至今仍是默认行为。如果你的 SQL 文件包含非 ASCII 字符中文、日文、韩文、emoji 等务必在每个 SQL 文件的第一行加SET NAMES utf8mb4;否则数据会被双重编码写入数据库。

相关推荐

AI电子宠物技术解析:从QQ宠物到Codex伴侣
AI电子宠物技术解析:从QQ宠物到Codex伴侣

1. 桌面电子宠物的文艺复兴:从QQ宠物到AI伴侣 2005年,一只胖乎乎的企鹅从QQ客户端右下角蹦出来,对着1.5亿中国网民喊"主人好"的场景,构成了千禧年初最鲜活的互联网记忆。如今OpenAI用Codex技术让电子宠物以全新形态回归… · 2026/9/26 20:16:30

GPT-5.6 Sol在Cerebras上实现750 TPS:AI智能体工作流的响应速度革命
GPT-5.6 Sol在Cerebras上实现750 TPS:AI智能体工作流的响应速度革命

1. 先搞清楚GPT-5.6 Sol在Cerebras上的750 TPS到底意味着什么看到GPT-5.6 Sol在Cerebras上达到750 TPS(每秒处理750个token)这个数字,很多人的第一反应可能是“文本生成变快了”。但实际测试和工程部署经验告诉我,这个数字背后真正… · 2026/9/26 20:16:12

北京华恒智信破解央企转型能力不足任职资格案例
北京华恒智信破解央企转型能力不足任职资格案例

【客户行业】央企;高新技术企业【问题类型】任职资格体系搭建【客户背景】该公司为某大型央企下属的一家技术单位,其业务范畴聚焦在专业领域,应用范围广泛,涵盖了由国务院授权管理的国有资产投资与运营,以及高新技术设… · 2026/9/19 18:47:05

Agent执行调度内核ax:基于Kubernetes与Gateway的Workspace实践
Agent执行调度内核ax:基于Kubernetes与Gateway的Workspace实践

1. 从“ax”这个标题说起:一个被低估的Agent执行调度内核“ax”这个词放在技术圈里,第一眼看上去像是个缩写,或者某个命令行工具的别名。但结合热搜词里的 agent、kubernetes、gateway、workspace 这几个关键词,它的真实身份就清晰… · 2026/9/26 20:17:24

Substrate框架从入门到实战:模块化架构、自定义托盘与运行时热升级
Substrate框架从入门到实战:模块化架构、自定义托盘与运行时热升级

1. 从一条链到一条链工厂:substrate 到底在解决什么问题如果你最近两年在区块链底层开发圈子里混,一定绕不开 substrate 这个词。我第一次接触它是在一个需要快速验证共识算法的项目里,当时团队评估了三条路:直接 fork 一条成熟公… · 2026/9/26 20:17:24

OpenRouter + CLI + MCP:构建可脚本化 AI Agent 工具链实战
OpenRouter + CLI + MCP:构建可脚本化 AI Agent 工具链实战

1. 从 "treg" 这个标题说起:一个被低估的 CLI Agent 工具链入口第一次看到 "treg" 这个词,很多人会以为是某个库的缩写或者拼写错误。但如果你最近在折腾 AI Agent 工具链,尤其是围绕 OpenRouter、MCP、CLI 这一套生态&a… · 2026/9/26 20:17:24

Claude金融领域插件开发实战:Managed Agents API与Cowork协作全解析
Claude金融领域插件开发实战:Managed Agents API与Cowork协作全解析

1. 从"financial-services"这个标题说起:一个被低估的领域插件第一次看到financial-services这个项目名,很多人会以为它是个后端微服务或者某个银行系统的代码仓库。但结合关键词里的Claude、Cowork、Managed Agents API、plugin这几个词&… · 2026/9/26 20:17:18

video-use:用ffmpeg+Remotion+ElevenLabs+Claude Code实现视频自动化生产
video-use:用ffmpeg+Remotion+ElevenLabs+Claude Code实现视频自动化生产

1. 从“video-use”这个标题说起:它到底想解决什么问题 第一次看到“video-use”这个标题,我脑子里蹦出来的不是某个具体工具,而是一类非常典型的需求: 用代码把视频处理这件事自动化起来 。你手上有一堆素材,可能是… · 2026/9/26 20:17:18

40G光模块选型与故障排查:从原理到实战全流程
40G光模块选型与故障排查:从原理到实战全流程

前几天有人问我40G光模块该怎么配,数据中心机柜里要把两台交换机用光纤连起来,预算有限,也不太想一步到位上100G。我脑子里第一个冒出来的就是光特通信的40G QSFP模块。这个线速率的方案听起来有点“上一代”,但在实际网络里占有率… · 2026/9/26 20:17:12

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码