phpMyAdmin 导入功能不执行 SET SESSION 语句,因其硬编码跳过所有 SET 开头语句;真正生效的方式是用 MySQL 命令行配合 --sql-mode 参数导入。

不能在 phpMyAdmin 里“临时关闭”MySQL 严格模式——它不提供会话级 sql_mode 修改入口,且 SET SESSION sql_mode 在导入流程中根本不会被执行。
为什么 phpMyAdmin 的 SQL 导入不响应 SET SESSION
phpMyAdmin 导入页面(import.php)不是把你的 SQL 文件内容逐行发给 MySQL 执行,而是先由 PHP 解析、拆分语句、再批量提交。所有以 SET 开头的语句(包括 SET SESSION sql_mode = ...)会被跳过或忽略——这是 phpMyAdmin 的硬编码行为,不是 bug,是设计限制。
- 你粘贴到「SQL」页执行的
SET SESSION只影响当前 SQL 标签页的单次查询上下文,对「导入」功能完全无效 - 即使你在 SQL 文件开头写了
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';,导入时也会被静默丢弃 - phpMyAdmin 6.0+ 已移除对
SET语句的解析支持,连警告都不报,直接跳过
真正能起效的临时绕过方式(仅限调试)
必须绕开 phpMyAdmin 的上传路径,用 MySQL 原生命令行 + 会话级参数启动导入:
- 确保目标数据库已存在:
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 终端执行(注意空格和引号):
mysql -u root -p --default-character-set=utf8mb4 --sql-mode="NO_ENGINE_SUBSTITUTION" mydb - 关键参数:
--sql-mode="NO_ENGINE_SUBSTITUTION"会覆盖服务端默认值,但只对本次连接生效;--default-character-set=utf8mb4防止字符集错位 - 若文件含
USE db_name;,必须删掉——命令行不自动识别该语句,否则报#1046 No database selected
导入前必须做的最小预处理(比关模式更可靠)
与其冒险降级 sql_mode,不如提前清理数据和语法。以下三步做完,90% 的严格模式报错消失:
立即学习“PHP免费学习笔记(深入)”;
- 删掉 SQL 文件里所有
DEFINER=`xxx`@`yyy`行:sed -i '/DEFINER=/d' dump.sql - 替换排序规则(尤其从 MySQL 8.0 导出的):
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql - 处理零日期:
sed -i "s/DEFAULT '0000-00-00'/DEFAULT CURRENT_TIMESTAMP/g" dump.sql,或直接删掉整段DEFAULT子句
最容易被忽略的细节:phpMyAdmin 的“字符集选择”根本不管用
右上角那个 Character set of the file 下拉框选了 utf8mb4,不代表 MySQL 会按这个编码解析。它只影响 phpMyAdmin 自己读取文件时的字节解码,而实际执行仍走服务端默认连接字符集。如果你没在 SQL 文件开头加 SET NAMES utf8mb4;,或没在命令行指定 --default-character-set,字段值照样被截断或乱码——这和 strict mode 报错常同时出现,但成因完全不同。



















