phpMyAdmin导入时SET SQL_MODE语句被跳过,需先在SQL页执行SET SQL_MODE=''等命令再导入,否则空字符串、零日期等会因严格模式报错;导入后应查@@sql_mode验证生效。
直接改 sql 文件开头的 set sql_mode 不起作用——phpmyadmin 导入页会跳过它,导致后续 insert 因空字符串、零日期等被严格模式拦截。
导出时就避开严格模式陷阱
phpMyAdmin 的「导出」页面本身不提供关闭严格模式的开关,但可以通过调整导出配置,让生成的 SQL 更兼容。关键不是事后修,而是源头少埋雷:
- 在「自定义导出」里,把
SQL compatibility mode设为MYSQL40或NONE(别选ANSI或POSTGRESQL) - 取消勾选「Add DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT statement」——这些语句在严格模式下可能因对象不存在而报错,干扰主数据导入
- 确保「Data creation options」中只勾选
INSERT,不要勾INSERT IGNORE或REPLACE,它们在严格模式下行为不一致,且可能掩盖字段类型不匹配问题 - 如果导出含
TIMESTAMP字段,提前确认源库没用'0000-00-00 00:00:00'值;若有,导出前先用UPDATE ... SET ts_col = NULL WHERE ts_col = '0000-00-00 00:00:00';清洗
导入前强制重置 SQL_MODE
不能依赖 SQL 文件里的 SET SQL_MODE 行,phpMyAdmin 的「导入」功能对这类语句执行不可靠。真正有效的做法是手动干预执行上下文:
- 打开 phpMyAdmin,先选中目标数据库(比如
myapp),再点顶部的SQL标签页 - 在文本框里粘贴并执行:
SET SQL_MODE = '';
——这行必须单独执行,且要在导入操作之前 - 然后再切到
Import标签页上传文件;此时整个导入过程都运行在空 SQL_MODE 下 - 如果只想放宽特定限制(比如允许零日期),可用:
SET SQL_MODE = 'ALLOW_INVALID_DATES';
,但别混用多个模式,MySQL 8.0+ 对组合模式校验更严
导入后立刻验证是否真生效
执行完导入,别急着关页面。严格模式是否真的被绕过,得看实际数据有没有被拒:
- 运行
SELECT @@sql_mode;确认当前会话模式已清空或按预期设置 - 检查有风险的字段:比如数字型字段是否插进了空字符串(
'')、DATETIME是否存了'0000-00-00'—— 如果这些值成功写入,说明SET SQL_MODE生效了 - 如果仍报
#1366 - Incorrect integer value: ''或#1292 - Truncated incorrect DOUBLE value,说明导入时根本没走你设的会话模式,极可能是你没先在SQL标签页执行那行SET,而是直接进了Import页
最易被忽略的一点:phpMyAdmin 的「导入」和「SQL」是两个隔离的执行环境。你在 SQL 标签页设的会话变量,不会自动带进 Import 标签页的后台任务里——除非你用的是「SQL」页粘贴大段脚本的方式导入(此时所有语句串行执行,SET 才真正生效)。
立即学习“PHP免费学习笔记(深入)”;



















