3

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

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

错误代码:1411。日期时间值不正确:函数 str_to_date 的“”

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

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

谢谢你的时间。

4

3 回答 3

8

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)

无警告:

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

于 2013-02-19T16:20:06.580 回答
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')

不久前,我尝试过ALLOW_INVALID_DATES使用 MySQL v.5 左右,但我认为它不起作用。现在我在 MySQL 8.0 上,当我ALLOW_INVALID_DATES在 mysql 终端会话中设置时,它可以工作。所以,它似乎ALLOW_INVALID_DATES很敏感。我正在运行 Mac OS 10.11.6

于 2019-09-06T18:12:27.253 回答
0

我在使用 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 存在一些错误,因为我在两个版本中使用了完全相同的脚本。

于 2022-02-26T17:40:24.947 回答