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

导入含'0000-00-00 00:00:00'的DATETIME数据报错1525求解决

解决MySQL导入零值日期报错(Error Code: 1525)的问题

问题根源

你的SQL语句报错,是因为MySQL 5.7+默认开启了STRICT_TRANS_TABLES和NO_ZERO_DATE模式。当查询旧表的date_column时,MySQL会先解析这个字段为DATETIME类型,而'0000-00-00 00:00:00'属于无效日期,直接触发校验错误——哪怕你后续要替换它,查询阶段已经报错了。

解决方案

方法一:临时修改会话SQL模式(适合一次性数据迁移)

在执行INSERT语句前,先临时关闭会话级别的严格校验和零日期限制,这样MySQL允许读取旧表的零值日期:

-- 保存原SQL模式(可选,执行完后可恢复)
SET @original_sql_mode = @@sql_mode;

-- 修改会话SQL模式,允许读取零日期
SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');
SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');

-- 执行你的插入语句
INSERT INTO new_table
(
  column_a,
  date_column
)
SELECT 
 column_a,
 IF(
     STRCMP(`date_column`,'0000-00-00 00:00:00')=0, 
     CURRENT_TIMESTAMP(), 
     `date_column`
 )         
FROM 
   old_table;

-- 恢复原SQL模式(可选)
SET SESSION sql_mode = @original_sql_mode;

方法二:修改SQL语句,避免直接解析无效日期

把日期字段转换为字符串后再比较,绕开MySQL的日期校验:

INSERT INTO new_table
(
  column_a,
  date_column
)
SELECT 
 column_a,
 CASE
     WHEN CAST(`date_column` AS CHAR) = '0000-00-00 00:00:00' THEN CURRENT_TIMESTAMP()
     ELSE `date_column`
 END AS date_column
FROM 
   old_table;

或者用二进制比较(性能略优,适合大数据量):

INSERT INTO new_table
(
  column_a,
  date_column
)
SELECT 
 column_a,
 IF(
     HEX(`date_column`) = '00000000000000', 
     CURRENT_TIMESTAMP(), 
     `date_column`
 )         
FROM 
   old_table;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:42:03