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_SUBSTITUTIONsql_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
相关产品推荐
相关产品推荐

