【问题标题】:MySQL Error Code: 1411. Incorrect datetime value: '' for function str_to_dateMySQL 错误代码:1411。不正确的日期时间值:函数 str_to_date 的“”
【发布时间】:2013-02-19 15:46:44
【问题描述】:

我被要求对目前仅部署到 Linux 生产服务器的现有应用程序进行更改。我已经继续,并且该应用程序大部分时间都在我的本地 Windows PC 上运行。我在本地 PC 上安装了来自 Production 的 MySQL DB 的完整副本。生产数据库在 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

我查看了 Production my.cnf 和我的本地 my.ini 寻找任何主要差异,我还尝试在本地使用 sql-mode "ALLOW_INVALID_DATES" 但它没有改变最终结果。

我知道我可以更改代码以不传入这些空字符串,但有很多这样的语句,此时我不希望尽可能更改所有这些语句。该客户的预算和时间有限,我想专注于他们的新要求。如果可能的话,我正在寻找有关如何让我的本地环境像在生产环境中一样工作的意见。

感谢您的宝贵时间。

【问题讨论】:

  • '' 不是有效日期.. 应该添加什么日期?当前日期?
  • 不,它在本地和生产中都传入了一个空字符串。我知道这很奇怪,我不确定它在生产环境中是如何工作的,但确实如此。

标签: mysql


【解决方案1】:

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 可以为空。

【讨论】:

  • 对不起,如果我不清楚。我的代码中出现 SQLException,它报告的错误与在 MySQL Workbench 的查询窗口中运行查询时遇到的错误相同。以下输出是我在 MySQL Workbench 查询窗口中直接在我的代码之外执行原始查询时得到的结果。 ACTION: update atable set adate=DATE_ADD(str_to_date('xxx','%m/%d/%Y'), INTERVAL 0 DAY) where anum='1' Message: Error Code: 1411. Incorrect datetime value: '' for function str_to_date 无论是否在 my.ini 中启用 ALLOW_INVALID_DATES 模式,都会发生这种情况。
  • 因此您的代码和 Workbench 都将警告报告为错误。不确定您想要什么答案——您可以放松 SQL 模式以避免基本警告,或者您可以更改查询。基本上就这些了。
  • 如前所述,我尝试了 ALLOW_INVALID_DATES 模式,但没有帮助。生产服务器没有定义任何模式。我一直在查看 SQL Modes 文档,但不确定要尝试什么其他选项。建议? --- 顺便说一句,感谢您的所有意见!
  • @ItBHarsH - 是否有可能您没有正确使用语法或在不同会话中运行查询?
  • 我的代码中有一个断点,我正在复制/粘贴,所以语法是一样的。
【解决方案2】:

我在尝试加载日期有一些空白值的数据时遇到了同样的 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

【讨论】:

    【解决方案3】:

    我在使用 MySQL 服务器版本 8.0.28-0ubuntu0.20.04.3 (Ubuntu) 时遇到了同样的问题,代码如下:

    insert into documents (data) values (IF((@d := STR_TO_DATE("", "%Y-%m-%d")) IS NULL, null, @d));

    但使用 SELECT 并没有显示问题:

    select IF((@d := STR_TO_DATE("", "%Y-%m-%d")) IS NULL, null, @d);

    解决方案是从 MySQL 更改为 MariaDb 10.3.31。不再出现错误代码 1411。

    我猜 MySQL 8.0.28 存在一些错误,因为我在两个版本中使用了完全相同的脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2017-09-17
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多