查当前phpEnv的MySQL sql_mode可用SELECT @@GLOBAL.sql_mode(phpMyAdmin)或PHP脚本执行SELECT @@SESSION.sql_mode;永久修改需编辑my.ini中[mysqld]段落,设置sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION(8.0+删NO_AUTO_CREATE_USER),保存后重启MySQL服务。

phpEnv 中 MySQL 导入数据报错(如 Invalid default value for 'xxx'、Incorrect date value、Field doesn't have a default value),绝大多数情况是 MySQL 的 sql_mode 太宽松,而导入的 SQL 文件(尤其来自新版本或严格环境导出)依赖更严格的校验规则。直接改 sql_mode 是最根本的解法。
怎么查当前 phpEnv 里的 MySQL sql_mode?
phpEnv 默认没开命令行终端直连,但你可以用任意 PHP 脚本或 phpMyAdmin 执行查询:
- 在 phpMyAdmin 的「SQL」页中执行:
SELECT @@GLOBAL.sql_mode; - 或者写个
check_mode.php放到www/目录下访问:<?php $pdo = new PDO('mysql:host=127.0.0.1;port=3306', 'root', 'root'); var_dump($pdo->query("SELECT @@SESSION.sql_mode")->fetchColumn()); ?> - 常见默认值(尤其 phpEnv 旧版):
NO_ENGINE_SUBSTITUTION,缺STRICT_TRANS_TABLES或STRICT_ALL_TABLES—— 这正是导致插入 NULL 到 NOT NULL 字段不报错、零日期被静默转成'0000-00-00'的根源
怎么通过 phpEnv 配置文件永久修改 sql_mode?
phpEnv 的 MySQL 配置文件路径通常是:D:\phpenv\mysql\my.ini(Windows)或 /usr/local/phpenv/mysql/my.cnf(Linux/macOS)。别去改启动脚本或注册表,只动这个文件。
- 用记事本或 VS Code 打开
my.ini,搜索[mysqld]段落 - 在该段落下新增或修改这一行:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION - 注意:MySQL 8.0+ 已移除
NO_AUTO_CREATE_USER,若用 8.0+ 版本,请删掉它,否则启动失败;可换成ONLY_FULL_GROUP_BY补强 - 保存后,必须重启 MySQL 服务 —— 在 phpEnv 控制面板里点「MySQL 重启」,或进任务管理器结束
mysqld.exe进程再重开
导入前临时设 sql_mode 避免改配置?
如果你只是偶尔导入一个 SQL 文件,不想动全局配置,可以在导入前手动设置会话级 sql_mode。但注意:phpMyAdmin 和大多数 GUI 工具不支持在导入时自动执行前置语句,所以得拆两步走。
立即学习“PHP免费学习笔记(深入)”;
- 第一步:在 phpMyAdmin 的「SQL」页中执行:
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO'; - 第二步:立刻切换到「导入」页,上传并执行 SQL 文件(确保「启用 SET 选项」勾选,且「SQL 兼容模式」选
None) - ⚠️ 不推荐用
SET GLOBAL sql_mode=...:它需要 SUPER 权限,phpEnv 默认 root 用户通常没给;且对已建立的连接无效,只影响后续新连接,而 phpMyAdmin 导入用的是当前连接
为什么改了 sql_mode 还报错?检查这三点
改完重启 MySQL 仍报错,大概率不是没生效,而是其他环节绕过了你的设置:
- PHP 应用(如 ThinkPHP、WordPress)可能在连接时用
PDO::MYSQL_ATTR_INIT_COMMAND强制覆盖了sql_mode,检查项目数据库配置里有没有类似"init_command" => "SET sql_mode='...'"的硬编码 - 导入的 SQL 文件开头自带
SET sql_mode=...语句,会覆盖你配置文件的设置 —— 用文本编辑器打开 SQL 文件,删掉开头几行的SET或/*!40101 SET ... */注释块 - phpEnv 自带的 MySQL 版本太老(如 5.5),某些 mode(如
ONLY_FULL_GROUP_BY)不支持,升级 phpEnv 或换用官方 MySQL 压缩包更稳妥
真正关键的不是“能不能改”,而是改完是否被应用层、SQL 文件、连接驱动层层覆盖。优先从配置文件改起,再逐层排查覆盖点 —— 尤其是 SQL 文件头和 PHP 的 init_command。



















