mysql 1364错误本质是strict mode启用导致,当插入数据时缺失非空且无默认值字段(如col_b)即报错;解决需在phpenv的my.ini[mysqld]段设sql_mode="no_engine_substitution"并重启mysql服务。

MySQL 1364 错误本质是 strict mode 在作怪
PHP 环境里执行 INSERT INTO table (col_a) VALUES ('x') 报 Field 'col_b' doesn't have a default value(错误号 1364),根本原因不是 PHP 或 phpEnv 配置错了,而是 MySQL 启用了严格模式(STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES),它拒绝插入缺失非空且无默认值字段的记录。
phpEnv 中关闭 strict mode 的实操路径
phpEnv 默认集成的 MySQL(如 5.7+)通常开启严格模式。要临时绕过 1364,需修改 MySQL 运行时 SQL 模式:
- 进入 phpEnv 控制面板 →「数据库」→「MySQL 配置」→ 找到
my.ini或my.cnf(Windows 下多为my.ini,路径类似D:\phpEnv\MySQL\my.ini) - 在
[mysqld]段落下添加或修改这一行:sql_mode = "NO_ENGINE_SUBSTITUTION"
(注意:不要留空,也不要写""或0) - 保存后务必重启 MySQL 服务(phpEnv 面板里点「重启 MySQL」,或进 Windows 服务管理器手动重启
mysql_phpEnv服务) - 验证是否生效:用 phpMyAdmin 或命令行连上 MySQL,执行
SELECT @@sql_mode;,输出中不应再出现STRICT_TRANS_TABLES
不推荐永久关 strict mode 的真实代价
虽然关掉 strict mode 能让旧代码“跑起来”,但隐患明显:
- 字段为
NOT NULL却没给值时,MySQL 会静默填入隐式默认值(如字符串填''、数字填0),导致数据语义失真 - 某些框架(如 Laravel、ThinkPHP)依赖严格模式报错来暴露模型定义与表结构不一致的问题
- 上线生产环境时,云数据库(阿里云 RDS、腾讯云 CDB)默认强制开启 strict mode,本地能跑线上必挂
- 更稳妥的做法是:对出错字段补默认值(
ALTER TABLE t MODIFY col_b VARCHAR(255) DEFAULT '' NOT NULL)或改 INSERT 语句显式赋值
phpEnv 下快速验证 strict mode 是否生效的 SQL
别只信配置文件改了就完事,每次重启后都该跑一句确认:
SELECT @@sql_mode;
如果返回结果包含 STRICT_TRANS_TABLES,说明没生效——常见原因是:
- 改错了文件(比如改了客户端的
my.ini,实际服务端读的是另一个) - 配置项写在了
[client]段而非[mysqld]段 - 有多个
sql_mode配置项,后加载的覆盖了前一个(检查整个文件是否重复出现) - MySQL 启动时加了
--sql-mode命令行参数,它优先级高于配置文件
真正生效的标志是:返回结果里只有 NO_ENGINE_SUBSTITUTION、NO_ZERO_DATE 这类非严格项,且绝对不含 STRICT_*。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











