mysqldump导出中文乱码的根本原因是未在命令最前加--default-character-set=utf8mb4,导致其默认用latin1读取utf8mb4源库,中文在导出瞬间即被错位损坏;必须验证源库字符集、正确放置参数、检查导出文件编码并导入时同步指定utf8mb4。

mysqldump 导出时没强制指定 --default-character-set=utf8mb4,Windows 上默认用 cp1252 或 gbk 解析 SQL 文件,中文直接变 ? 或乱码——这不是导入后才出问题,而是导出那一刻就错了。
导出前必须确认源库真实字符集
别信“Linux 默认 utf8mb4”这种说法。MySQL 5.7 和 8.0 的默认值不同,老库可能建在 latin1 上,靠客户端硬解蒙混过关。
- 执行
SHOW VARIABLES LIKE 'character_set%';,重点看character_set_server和collation_server - 查库级编码:
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'your_db'; - 查表级编码:
SHOW CREATE TABLE your_table;,确认末尾是DEFAULT CHARSET=utf8mb4,不是utf8(那是utf8mb3)
导出命令必须带 --default-character-set=utf8mb4 且放最前面
这个参数位置敏感:它影响 mysqldump 读取表结构和数据时的解码方式。不加或放错位置,mysqldump 就按当前终端或 my.cnf 里声明的 client 字符集去读,大概率是 latin1,结果导出的 SQL 里中文已损坏。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 正确写法:
mysqldump --default-character-set=utf8mb4 --single-transaction -u root -p your_db > dump.sql - 务必加
--single-transaction,避免FLUSH TABLES WITH READ LOCK在 Windows 上卡住写入 - 导出后检查开头是否有
SET NAMES utf8mb4;;没有就说明参数没生效 - 别用记事本打开或保存
dump.sql——它会悄悄加 BOM(ef bb bf),Windows 下mysql命令直接报ERROR 1064
导入前手动建库并指定 utf8mb4 字符集
mysqldump 默认不生成 CREATE DATABASE 语句(除非加 --databases),即使有,目标 MySQL 也可能忽略它或不校验字符集是否匹配。
- 先登录 Windows 的 MySQL:
mysql -u root -p - 执行:
CREATE DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 导入时也强制指定客户端编码:
mysql --default-character-set=utf8mb4 -u root -p your_db - 如果用 MySQL 客户端内执行
source dump.sql,大文件易超时中断,错误难定位,不推荐
lower_case_table_names 必须提前设为 1 并重启服务
Linux 默认 lower_case_table_names=0(区分大小写),Windows 默认是 1(强制小写)。迁移后表名全变小写,应用连 UserOrder 都找不到。
- 编辑 Windows 的
my.ini,在[mysqld]段落下加:lower_case_table_names=1 - 必须彻底重启 MySQL 服务(不是 reload),否则不生效
- 验证:
SELECT @@lower_case_table_names;返回1才算成功 - 注意:这个参数只能在首次启动前设置;已有数据再改,可能导致元数据不一致甚至崩溃
client/connection/results/table/column)中任意一层错位都会触发乱码。导出、传输、建库、导入、应用连接,每一步都得对齐 utf8mb4,少一个环节,就多一分静默失败的风险。










