mysqldump跨平台迁移必须显式指定--default-character-set=utf8mb4,确认源库字符集与版本兼容性,避免windows换行符干扰,并在目标端手动创建utf8mb4数据库后再导入。

mysqldump 导出时必须指定字符集
跨平台迁移最常踩的坑是字符集不一致导致乱码,尤其是从 Windows(默认 latin1 或 cp1252)迁移到 Linux(通常 utf8mb4)。mysqldump 默认不显式声明字符集,导出时会继承客户端连接的 character_set_client,而该值在不同系统上可能不同。
正确做法是强制指定导出编码:
mysqldump --default-character-set=utf8mb4 -u root -p database_name > backup.sql
- 务必加上
--default-character-set=utf8mb4,不能只靠SET NAMES或配置文件 - 导出前确认源库实际用的字符集:
SHOW CREATE DATABASE database_name;和SHOW CREATE TABLE table_name; - 如果源库含 emoji 或四字节 UTF-8 字符,
utf8(MySQL 中实际是 utf8mb3)会截断,必须用utf8mb4
目标 MySQL 版本需 ≥ 源版本,否则可能无法导入
MySQL 的 .sql 文件不是完全向后兼容的。高版本生成的转储文件(如含 JSON 字段、generated column、utf8mb4_0900_as_cs 排序规则)在低版本上执行会报错,例如:
Unknown character set: 'utf8mb4_0900_as_cs' 或 This version of MySQL doesn't yet support 'JSON'
- 迁移前运行
SELECT VERSION();对比两端 MySQL 版本 - 若目标版本较低,导出时加
--compatible=mysql40或--compatible=ansi降级语法(但会丢失部分特性支持) - 更稳妥的方式是升级目标 MySQL 到相同或更高主版本(如 8.0 → 8.0.33,而非 8.0 → 5.7)
Windows 路径换行符可能破坏 SQL 文件结构
Windows 系统下用文本编辑器(如记事本)打开或编辑 backup.sql 后保存,可能将 LF(Linux 标准)转为 CRLF,虽然不影响大多数 SQL 执行,但在极少数场景(如含多行字符串、存储过程定义中有隐式换行判断)会引发语法错误或逻辑偏差。
- 导出后检查文件换行符:
file backup.sql(Linux/macOS)或用 VS Code 查看右下角显示 - 推荐全程在 Linux/macOS 下导出;若必须在 Windows 执行,用
git bash或WSL运行mysqldump,避免 cmd/powershell 环境干扰 - 导入前可用
dos2unix backup.sql统一换行符(Linux 工具),或用sed -i 's/\r$//' backup.sql
导入前需手动创建数据库并匹配字符集
mysqldump 默认不包含 CREATE DATABASE 语句(除非加 --databases 参数),且即使有,其字符集也是导出时快照,不一定适配目标环境。
常见错误:ERROR 1046 (3D000): No database selected 或导入后中文仍是问号
- 先在目标库手动建库,并显式指定字符集:
CREATE DATABASE new_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 再导入:
mysql -u root -p --default-character-set=utf8mb4 new_db - 注意:导入命令中的
--default-character-set=utf8mb4必须与导出时一致,否则客户端解码仍可能出错
utf8mb4 才真正安全。










