phpEnv 默认启用 STRICT_TRANS_TABLES 严格模式,导致 MySQL 拒绝向 NOT NULL 列插入 NULL;可通过 SELECT @@sql_mode 确认,临时 SET sql_mode='' 验证,修改 my.ini 中 sql-mode 移除 STRICT_TRANS_TABLES 并重启服务,但根本需检查表结构与代码传值逻辑。

phpEnv 本身不控制 MySQL 的非空约束,错误 1048 Column 'xxx' cannot be null 是 MySQL 层抛出的,根源在数据库配置或表结构,不是 phpEnv 的 bug 或设置问题。改 phpEnv 配置不会绕过这个错误——它只是个本地开发环境套件,底层用的是它打包的 MySQL 实例。
怎么确认是不是 phpEnv 自带 MySQL 的 strict mode 导致的
phpEnv 默认启用严格模式(STRICT_TRANS_TABLES),这会让 MySQL 拒绝向 NOT NULL 列插入 NULL 或空字符串(尤其对 INT、TIMESTAMP 等类型更敏感)。
- 进 phpEnv 的 MySQL:打开终端,运行
phpenv mysql或直接连它内置的 MySQL(端口通常是3306,用户root,密码为空) - 执行
SELECT @@sql_mode;,如果返回包含STRICT_TRANS_TABLES,就是它在起作用 - 临时验证:执行
SET sql_mode = '';,再试一次插入;如果成功,说明 strict mode 是直接诱因
修改 phpEnv 中 MySQL 的 sql-mode 配置
phpEnv 的 MySQL 配置文件位置取决于安装方式,常见路径是:C:\phpEnv\mysql\my.ini(Windows)或 /usr/local/phpenv/mysql/my.cnf(macOS/Linux 类似路径)。别改错文件——phpEnv 的 MySQL 和系统 MySQL 是隔离的。
- 在
[mysqld]段下添加或修改这一行:sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" - 如果已有
sql-mode行,把STRICT_TRANS_TABLES整个删掉,保留其余项 - 额外注意:
explicit_defaults_for_timestamp在 MySQL 5.6+ 默认为ON,会导致无默认值的TIMESTAMP列被当作NOT NULL处理;加上explicit_defaults_for_timestamp=OFF更稳妥 - 改完必须重启 phpEnv 的 MySQL 服务(通常用 phpEnv 控制面板点“Restart MySQL”,或命令行执行
phpenv mysql restart)
为什么改了 sql-mode 还报 1048 错误
常见原因是表结构里真有列定义为 NOT NULL,且你代码传了 NULL 或没传值——strict mode 只是让这个错误“立刻暴露”,不是“制造”错误。
立即学习“PHP免费学习笔记(深入)”;
- 用
DESCRIBE your_table;检查目标列是否带NULL标记:显示NO就代表NOT NULL,必须给值 - PDO 绑定时如果
$_POST['name']为空或未提交,bindValue(':name', $_POST['name'])会传NULL,触发 1048 - 修复方式不是关 strict mode,而是补值:比如用
$_POST['name'] ?? ''或trim($_POST['name']) ?: '未知' - 如果字段逻辑上允许空,直接改表:
ALTER TABLE your_table MODIFY name VARCHAR(255) NULL;
容易被忽略的 timestamp 和 auto_increment 场景
MySQL 5.7+ 下,一个没设默认值、也没设 NULL 的 TIMESTAMP 列,在 strict mode 下插入 NULL 或空字符串会报 1048;同样,auto_increment 主键如果显式传 NULL 或 0,在 strict mode 下也会失败(期望由 MySQL 自增生成)。
- 检查这类列是否被你的 ORM、PDO 插入语句意外覆盖:比如
INSERT INTO t (id, name) VALUES (NULL, 'a')—— id 是auto_increment,不该手动填NULL - timestamp 列建议统一加
DEFAULT CURRENT_TIMESTAMP,或明确设为NULL并允许为空 - phpEnv 的 MySQL 版本若 ≥5.7,
explicit_defaults_for_timestamp=OFF能缓解旧应用兼容性问题,但不能替代表结构审查



















