You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL将'0000-00-00'转为NULL报错#1292,求解决方法

问题原因及解决方案

嘿,我来帮你搞定这个头疼的问题!

为什么会报错?

MySQL 5.7 默认启用了两个关键的sql_mode设置:NO_ZERO_DATE和STRICT_TRANS_TABLES。前者直接禁止了0000-00-00这种无效的日期值,后者开启了严格的事务表校验——哪怕你是要把这个无效日期替换成NULL,数据库也会先检查原数据的有效性,所以直接触发了#1292错误。

修复方法

方法一:临时调整会话模式(一次性操作)

这个方法只在当前数据库会话生效,适合快速处理:

  • 先查看当前的sql_mode配置:
    SELECT @@sql_mode;
    
    你会看到结果里包含NO_ZERO_DATE和STRICT_TRANS_TABLES。
  • 临时移除这两个限制:
    SET sql_mode = REPLACE(REPLACE(@@sql_mode, 'NO_ZERO_DATE', ''), 'STRICT_TRANS_TABLES', '');
    
    (如果你的sql_mode里还有其他配置,这个语句只会移除指定的两个,不会影响其他设置)
  • 执行你的更新语句:
    UPDATE 你的表名 SET bezahltDatum = NULL WHERE bezahltDatum = '0000-00-00';
    

方法二:永久修改配置(长期生效)

如果你不想每次都临时调整,可以修改MySQL的配置文件:

  • 找到MySQL的配置文件(Linux下通常是/etc/my.cnf或/etc/mysql/my.cnf,Windows下是my.ini)。
  • 找到sql_mode对应的行,移除其中的NO_ZERO_DATE和STRICT_TRANS_TABLES。比如原配置可能是:
    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    
    修改后变成:
    sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    
  • 保存配置文件,重启MySQL服务,之后这个限制就永久解除了。

备选小技巧(不一定通用)

如果你不想改动sql_mode,可以试试用NULLIF函数直接替换,不过可能还是会受严格模式限制:

UPDATE 你的表名 SET bezahltDatum = NULLIF(bezahltDatum, '0000-00-00');

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:08:53