我被要求对现有应用程序进行更改,此时此应用程序仅部署到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
”但它确实不改变最终结果。
我知道我可以将代码更改为不传入这些空字符串,但是有很多这样的语句,此时我不希望在可能的情况下对所有这些语句进行更改。该客户的预算和时间有限,我希望专注于他们的新要求。我正在寻找关于如何让我的本地环境像生产中那样工作的输入。
感谢您的时间。
答案 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