mysql报错1292本质是sql_mode过于严格,含no_zero_in_date和no_zero_date导致‘0000-00-00 00:00:00’等非法日期被拒;需通过set global临时修改或在my.ini中永久配置sql_mode并重启服务解决。

phpEnv 里 MySQL 报 1292 错误,本质是 sql_mode 太严格,不是 phpEnv 本身的问题,改对配置就能过
查当前 sql_mode 是什么
进 phpEnv 自带的 phpMyAdmin 或用命令行连上 MySQL,执行:SELECT @@sql_mode;。常见返回里会包含 NO_ZERO_IN_DATE 和 NO_ZERO_DATE —— 这俩就是拦路虎。只要它们存在,'0000-00-00 00:00:00' 或空字符串转 datetime 就必然报错。
临时改 sql_mode(重启失效)
适合快速验证或导入一次 SQL 文件:
- 执行
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';(去掉那两个 ZERO 相关项) - 注意:phpEnv 的 MySQL 服务可能以非 root 用户启动,
SET GLOBAL需要 SUPER 权限;若权限不足,直接跳到下一条——改配置文件 - 改完后新建立的连接才生效,已存在的连接仍用旧 mode
永久修改 my.ini(phpEnv 必须走这步)
phpEnv 的 MySQL 配置文件通常在:phpEnv\MySQL\my.ini(路径以你实际安装为准)。用记事本打开,在 [mysqld] 段落下添加或修改这一行:
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
保存后,必须彻底关闭 phpEnv 的 MySQL 服务再重启(只点“重启”有时不生效)。验证方式:重启后再次执行 SELECT @@sql_mode;,确认返回中已无 NO_ZERO_IN_DATE 和 NO_ZERO_DATE。
导入 SQL 时仍报 1292?检查数据本身
sql_mode 改对了,还报错,大概率是数据里混了非法格式:
-
'0000-00-00'、'0000-00-00 00:00:00'这类值,即使 mode 放宽,某些版本(尤其 MySQL 8.0+)仍可能拒收 - CSV 或 SQL 文件里日期字段被双引号包着但含不可见字符(比如 Windows 换行
\r),导致解析失败 - 用
LOAD DATA INFILE时,字段分隔符或行结束符没对齐,把非日期内容塞进了 datetime 列 - PHP 导出数据时用了
date('Y-m-d H:i:s', 0),结果生成'1970-01-01 00:00:00'被当合法值,但原业务逻辑其实是想表达“空”,应改用NULL
真正麻烦的从来不是改配置,而是历史数据里那些看起来像日期、其实根本不是日期的字符串 —— 它们藏在备份 SQL 里,不动声色,直到你换环境才突然跳出来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











