phpMyAdmin 不是迁移工具,直接导出再导入 MySQL 5.7→8.0 会因 SQL 兼容性断层失败;需手动清理导出文件:替换 DEFAULT CHARSET=utf8 为 utf8mb4、删除 mysql 库 INSERT 语句、修正 CREATE USER 语法、移除 NO_AUTO_CREATE_USER 等不兼容项,并导入前执行 SET NAMES utf8mb4。
phpMyAdmin 本身不是迁移工具,它只是数据库管理界面。直接用它“导出再导入”5.7 → 8.0,大概率失败——不是界面问题,而是底层 SQL 兼容性断层导致的。
常见错误包括:ERROR 1064 (42000)(语法错误)、ERROR 1292 (HY000)(隐式转换警告升级为错误)、ERROR 1054 (42S22)(Unknown column 'password' in 'field list')。这些都不是 phpMyAdmin 的 bug,而是它默认导出的语句含 5.7 特有结构:
CREATE USER 语句带 PASSWORD 子句(8.0 已废弃,改用 IDENTIFIED WITH caching_sha2_password BY 'xxx')INSERT INTO mysql.user 直写 password 字段(8.0 表结构已改为 authentication_string)DEFAULT CHARSET=utf8(实际是 utf8mb3,8.0 默认拒绝该声明,需显式写成 utf8mb4)sql_mode 包含 NO_AUTO_CREATE_USER(8.0 已移除,导入时直接报错)不能跳过这步。导出后打开 .sql 文件,逐项处理:
DEFAULT CHARSET=utf8 → DEFAULT CHARSET=utf8mb4(注意:只换建表语句里的,别动注释或数据值)INSERT INTO `mysql`. 开头的语句(系统库严禁导入)CREATE USER 'xxx'@'%' IDENTIFIED BY 'xxx'; 改成:CREATE USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';(若应用不支持 caching_sha2_password)SET @@sql_mode= 开头的整行(尤其含 NO_AUTO_CREATE_USER 的)TYPE=MyISAM,替换成 ENGINE=MyISAM(8.0 仍支持 MyISAM,但语法已变)即使改完 SQL,直接在 phpMyAdmin 界面导入仍可能失败。原因:phpMyAdmin 默认用 utf8 连接,而 8.0 要求连接层也用 utf8mb4:
SET NAMES utf8mb4;(在 SQL 窗口运行一次)mysql -u root -p --default-character-set=utf8mb4 your_db
phpMyAdmin 导出的 SHOW GRANTS 结果无法直接在 8.0 执行。正确做法是:
SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user != 'mysql.infoschema';,然后逐条运行结果得到 grant 语句GRANT 语句,手动改成 8.0 兼容格式(比如去掉 WITH GRANT OPTION 后面的 MAX_QUERIES_PER_HOUR 0 等已弃用参数)CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; GRANT SELECT ON db.* TO 'app'@'%';
真正卡住人的地方不在操作步骤多,而在「哪些语句要删、哪些要改、哪些看似无关实则致命」——比如一个没注意到的 password 字段 INSERT,会让整个 mysql.user 表损坏,后续所有用户都登不上。