截断不正确的日期值
Posted
技术标签:
【中文标题】截断不正确的日期值【英文标题】:Truncated incorrect date value 【发布时间】:2014-01-19 05:29:25 【问题描述】:在我的情况下,我需要处理无效的日期值,例如:'04070$'。即使我收到错误的输入,例如:'04070$',我也需要插入一些内容。
当我这样做时:
select str_to_date('04070$','%m%d%Y') from dual;
结果是:
2000-04-07
但是对于插入语句,我得到一个错误:
INSERT INTO `table1` ( `Date_Posted`) VALUES (str_to_date('04070$','%m%d%Y'))
#1292 - Truncated incorrect date value: '04070$'
我不明白为什么 select 语句运行正常而 insert 语句出错。有没有办法让 insert 语句在出现此类不正确的值时插入 NULL 或日期(即使它不正确)?
【问题讨论】:
【参考方案1】:这是因为 mysql 在 Strict Mode 上运行。
在SELECT
语句中,STR_TO_DATE()
将返回一年,但由于它不是 100% 匹配,它也会发出警告:
mysql> SELECT str_to_date('040710$','%m%d%y');
+---------------------------------+
| str_to_date('040710$','%m%d%y') |
+---------------------------------+
| 2010-04-07 |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)
如您所见,警告只是在选择结果中提到的一点点,但它仍然存在:
mysql> show warnings;
+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect date value: '040710$' |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
在严格模式下,任何警告都会在尝试INSERT
/UPDATE
时变为错误。这就是为什么您可以在 select 上看到日期但无法将其保存在数据库中的原因。
【讨论】:
那么如何摆脱这个警告呢?当然关闭严格模式不是一种选择。我们是否应该将 substr 日期限制为 6 位? 有几个选项...您可以在发送之前解析日期,您可以使用insert ignore
语句,甚至创建一个函数,如果您的大部分逻辑都在数据库中。这完全取决于您的应用程序以及最适合的应用程序:)【参考方案2】:
将年份格式更改为大写。
str_to_date('01-01-2000','%d-%m-%Y')
【讨论】:
与 MySQL 的函数str_to_date
相关的可能的 format-specifier 在 symbols table at DATE_FORMAT
中描述【参考方案3】:
虽然你的问题是有效的。但请记住,这是警告而不是错误。
在这种情况下也插入了行。我用一个例子交叉检查了它,它工作正常。
由于 MySQL 总是在匹配适当的数据类型后截断列值,并从完整的字符串中截断不匹配的数据或超出范围的值。
示例:如果要在 char(3) 中插入 'ABCDEFGHIHJHJ',它会截断字符串并在行中插入 ABC。
【讨论】:
在我的情况下这是一个错误Error in query (1292): Truncated incorrect datetime value
。它可以防止插入,而选择工作正常【参考方案4】:
Select 语句和 Insert 语句都会出错,因为 $ 不会被视为数字。应该是
INSERT INTO `table1` ( `Date_Posted`) VALUES (str_to_date('040709','%m%d%Y')).
用于使用条目 2009-04-07 插入表 1
【讨论】:
是的,它确实给出了 MySQL 1292 错误:截断不正确的日期值:'04070$' 它可能会在您的系统中提供。它没有给我。一定是一些配置相关的问题。以上是关于截断不正确的日期值的主要内容,如果未能解决你的问题,请参考以下文章
数据截断:截断不正确的 DOUBLE 值:'3ML80909540'
错误号:1292 在我的 SQL 错误中截断了不正确的 DOUBLE 值