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/10/14 4:28:31 阅读更多 →
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/10/16 9:57:14 阅读更多 →
改进YOLOv11在芦笋智能分拣中的应用与优化

改进YOLOv11在芦笋智能分拣中的应用与优化

1. 项目背景与核心价值芦笋作为高附加值农产品,采后分级是影响其商品价值的关键环节。传统人工分拣存在效率低、标准不统一等问题,梁嘉平团队提出的基于改进YOLOv11的检测方法,为智慧农业中的农产品品质管控提供了创新解决方案。这项研究将计…

2026/10/15 6:56:20 阅读更多 →

最新新闻

SvalbardIdeaVault 许可与局限:CC BY 4.0、arXiv元数据条款与LLM标注注意事项,一文说清

SvalbardIdeaVault 许可与局限:CC BY 4.0、arXiv元数据条款与LLM标注注意事项,一文说清

【免费下载链接】SvalbardIdeaVault 项目地址: https://ai.gitcode.com/hf_mirrors/Jerry999/SvalbardIdeaVault 点击查看 免费下载 SvalbardIdeaVault 是一个包含 2,669,631 篇 arXiv 论文研究想法 的开源数据集,每篇论文都被提炼为「问题定义 核心直…

2026/10/17 20:21:28 阅读更多 →
基于马尔可夫链与NSGA2的水资源公平分层分配模型

基于马尔可夫链与NSGA2的水资源公平分层分配模型

简介:这份资源是2022年美国数学建模竞赛(美赛)B题M奖优秀论文的完整PDF,面向备战美赛、数学建模竞赛的高校学生与建模爱好者,聚焦美国西部千年一遇干旱危机下的水资源分配最优化问题。论文提出FHSD公平分层供需模型&am…

2026/10/17 20:21:28 阅读更多 →
具身智能进入系统工程时代:感知-决策-行动-反馈闭环构建指南

具身智能进入系统工程时代:感知-决策-行动-反馈闭环构建指南

简介:本资源是中国信息通信研究院与北京人形机器人创新中心有限公司联合发布的《具身智能发展报告(2024年)》权威研报,面向AI研究人员、智能机器人开发者、产业规划者及高校师生,系统解答具身智能“是什么、怎么建、如…

2026/10/17 20:21:28 阅读更多 →
不学Python:Java老兵从零搭建AI Agent的完整工程化路线

不学Python:Java老兵从零搭建AI Agent的完整工程化路线

作为一个写了8年Java的老后端,今年最触动的不是我熟悉的框架又出了多少新版本,而是团队讨论AI Agent时,我突然发现自己有点插不上嘴。我身边的Java同事反应几乎一模一样:AI时代来了,赶紧学Python。我也跟风买了本Pytho…

2026/10/17 20:21:28 阅读更多 →
密码学C/C++实现:大整数基本运算函数详解与优化

密码学C/C++实现:大整数基本运算函数详解与优化

1. 从"能跑就行"到"跑得放心":为什么密码学库的基本运算函数值得单独拎出来说很多人第一次接触密码学C/C实现,都是从"调库"开始的——OpenSSL里一个EVP_EncryptInit就完事了,谁还关心底层大数加减乘除怎么写的…

2026/10/17 20:21:28 阅读更多 →
Kafka接入AI的工程实践:三种落地模式与消费者参数调优

Kafka接入AI的工程实践:三种落地模式与消费者参数调优

1. 为什么要把 Kafka 接入 AI,工程上到底图什么Kafka 和 AI 这两个词放在一起,听起来像又一轮技术风口炒作。但我在实际项目里把这套东西落地之后,发现它解决的是数据管道里几个特别真实、特别磨人的问题。先说结论:Kafka 接入 AI…

2026/10/17 20:20:28 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →