如果日期不正确,mysql会插入一个空日期

时间:2015-02-24 18:51:35

标签: mysql

确定,

所以我尝试插入日期' 2015-02-29' (它不存在,因为2015年不是闰年)进入mysql日期字段。它不是一种错误,而是插入' 0000-00-00'作为约会。

为什么会发生?我该如何预防或抓住这个?如何配置日期列?

由于

编辑:

数据已上传为CSV文件,并使用LOAD DATA INFILE插入。

我们可以假设以下查询:

INSERT INTO TableName ('date') VALUES ('2015-02-09')

1 个答案:

答案 0 :(得分:2)

您可以使用sql_mode来更改MySQL处理无效日期的行为。

根据MySQL manual,当您插入错误的日期值时会发生这种情况:

  

默认情况下,当MySQL遇到日期或时间类型的值时   超出范围或以其他方式对类型无效,它转换   值为该类型的“零”值。唯一的例外是   超出范围的TIME值被剪切到适当的端点   时间范围。

因此插入零值,您实际上会收到警告。您可以使用show warnings命令查看。

insert into TableName (`date`) values ('2015-02-29');
-- 1 row(s) affected
show warnings
-- Warning  1264    Out of range value for column 'date' at row 1

如果需要,您可以更改此行为以存储无效值(MySQL manual):

  

通过将SQL模式设置为适当的值,您可以指定更多   究竟是什么样的日期,你希望MySQL支持。 (见章节   5.1.7,“服务器SQL模式”。)通过启用ALLOW_INVALID_DATES SQL模式,您可以让MySQL接受某些日期,例如' 2009-11-31'。   当您想要存储“可能错误”的值时,这非常有用   用户已在数据库中指定(例如,在Web表单中)   供将来处理。

例如,以下内容应该有效:

set @@sql_mode='allow_invalid_dates';
insert into TableName (`date`) values ('2015-02-29');
-- 1 row(s) affected

或者,您也可以更改load data的行为或插入以报告错误:

  

处理空或不正确的字段值与此不同   描述了SQL模式是否设置为限制值。例如,   如果sql_mode =' TRADITIONAL,转换空值或值等   作为' x'对于数字列导致错误,而不是转换为0。   (对于LOCAL,警告发生而不是错误,即使有一个   限制性sql_mode值,因为服务器无法停止   在操作过程中传输文件。)

示例:

set @@sql_mode='traditional';
insert into TableName (`date`) values ('2015-02-29');
Error Code: 1292. Incorrect date value: '2015-02-29' for column 'date' at row 1