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

ItB*_*rsH 3 mysql

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

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

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

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

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

我看过Production my.cnf和我的本地my.ini寻找任何重大差异,我也尝试在ALLOW_INVALID_DATES本地使用sql-mode ,但它没有改变最终结果.

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

谢谢你的时间.

Álv*_*lez 7

SQLException不会直接从MySQL来的,它可能是你的客户端语言触发.MySQL只会生成一个通常可以忽略的警告.无论如何,ALLOW_INVALID_DATESSQL模式实际应该做的伎俩:

警告:

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)
Run Code Online (Sandbox Code Playgroud)

没有警告:

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)
Run Code Online (Sandbox Code Playgroud)

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

update atable 
set adate=NULL
where anum='1'
Run Code Online (Sandbox Code Playgroud)

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