确定,
所以我尝试插入日期' 2015-02-29' (它不存在,因为2015年不是闰年)进入mysql日期字段。它不是一种错误,而是插入' 0000-00-00'作为约会。
为什么会发生?我该如何预防或抓住这个?如何配置日期列?
由于
编辑:
数据已上传为CSV文件,并使用LOAD DATA INFILE插入。
我们可以假设以下查询:
INSERT INTO TableName ('date') VALUES ('2015-02-09')
答案 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