MySQL错误代码:1411。日期时间值不正确:''表示函数str_to_date

时间:2013-02-19 15:46:44

标签: mysql

我被要求对现有应用程序进行更改,此时此应用程序仅部署到Linux Production服务器。我已经完成了大部分工作在我的本地Windows PC上的应用程序。我在本地PC上安装了来自Production的MySQL数据库的完整副本。 Linux上的生产数据库为MySQL v5.0.95,Windows上的本地数据库为MySQL v5.5。两者都处于InnoDB模式。

我的问题是如下声明。制作通用的,以方便其他想要帮助的人使用。

update atable 
set adate=DATE_ADD(str_to_date('','%m/%d/%Y'), INTERVAL 0 DAY)
where anum='1'

在某些情况下会传递一个空字符串,其中在生产中不会导致任何问题,并允许保存/更新记录,但在本地它会抛出SQLException。所以我直接针对我的本地数据库尝试了SQL语句,在这两种情况下都收到以下错误消息。

  

错误代码:1411。日期时间值不正确:''表示功能   STR_TO_DATE

我查看了制作my.cnf和我的本地my.ini寻找任何重大差异,我也尝试在本地使用sql-mode“ALLOW_INVALID_DATES”但它确实不改变最终结果。

我知道我可以将代码更改为不传入这些空字符串,但是有很多这样的语句,此时我不希望在可能的情况下对所有这些语句进行更改。该客户的预算和时间有限,我希望专注于他们的新要求。我正在寻找关于如何让我的本地环境像生产中那样工作的输入。

感谢您的时间。

2 个答案:

答案 0 :(得分:6)

SQLException并非直接来自MySQL,它可能是由您的客户端语言触发的。 MySQL只会生成一个通常可以忽略的警告。无论如何,ALLOW_INVALID_DATES SQL模式应该实际上做到了这一点:

警告:

mysql> SET @@SESSION.sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (date_created) VALUES (str_to_date('','%m/%d/%Y'));
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------+
| Level   | Code | Message                                               |
+---------+------+-------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '' for function str_to_date |
+---------+------+-------------------------------------------------------+
1 row in set (0.00 sec)

没有警告:

mysql> SET @@SESSION.sql_mode='ALLOW_INVALID_DATES';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (date_created) VALUES (str_to_date('','%m/%d/%Y'));
Query OK, 1 row affected (0.03 sec)

编辑:如果您正在寻找重写查询的方法,可以尝试以下方法:

update atable 
set adate=NULL
where anum='1'

当然,这要求adate可以为空。

答案 1 :(得分:0)

尝试加载日期中包含空白值的数据时,我遇到了相同的1411错误:

CLM_FROM_DT is a DATE

LOAD DATA INFILE 'Sample_1.csv'
INTO TABLE INPATIENT
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(DESYNPUF_ID,
@CLM_FROM_DT)
SET CLM_FROM_DT = STR_TO_DATE(@CLM_FROM_DT, '%Y%m%d')

前一段时间,我在MySQL v.5或更高版本中尝试了ALLOW_INVALID_DATES,但我认为它没有用。现在,我使用的是MySQL 8.0,当我在mysql终端会话中设置ALLOW_INVALID_DATES时,它可以工作。因此,看来ALLOW_INVALID_DATES是敏感的。 我正在运行Mac OS 10.11.6