mysql - 需要允许' 0000-00-00 00:00:00'日期

时间:2017-04-24 13:11:54

标签: mysql

我想在MySQL中允许零日期。我已将sql_mode更改为ALLOW_INVALID_DATES,NO_ENGINE_SUBSTITUTION

我在/etc/mysql/my.cnf更改了它。

然而,当我尝试插入数据时,我得到了错误,

  

数据截断:日期时间值不正确:' 0000-00-00 00:00:00'

MySQL版本是5.7.18。

任何关于此的想法都会有很大的帮助。

6 个答案:

答案 0 :(得分:1)

您可能想了解其他模式设置,例如strict和NO_ZERO_IN_DATE以及NO_ZERO_DATE https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date

答案 1 :(得分:1)

要允许零日期(0000-00-00 00:00:00),您需要删除该限制。

要删除特定的SQL模式(在本例中为 NO_ZERO_DATE ),请找到当前的SQL模式:

SELECT @@GLOBAL.sql_mode;

复制结果并从中删除不需要的内容( NO_ZERO_DATE

例如:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

创建并打开此文件:

sudo vim /etc/mysql/conf.d/disable_strict_mode.cnf

并写入新的SQL模式并粘贴到其中:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

重新启动MySQL:

sudo service mysql restart

答案 2 :(得分:0)

我将在此假设您希望拥有一个有效的日期,以便您的查询永远不必检查NULL。

这样做的一种方法是使用我喜欢称之为“In perpetuity”的日期。

这些基本上是DATETIME数据类型允许的最小/最大日期。

在我的使用中,通常存在从 - 到对的“窗口”,但您可能只需要最小日期。

来自the Mysql manual

  

DATETIME类型用于包含日期和时间的值   部分。 MySQL在'YYYY-MM-DD中检索并显示DATETIME值   HH:MM:SS'格式。支持的范围是'1000-01-01 00:00:00'到   '9999-12-31 23:59:59'。

所以可能对您有用的一种方法是利用'1000-01-01 00:00:00'而不是零日期。

答案 3 :(得分:0)

我可以通过使用zeroDateTimeBehavior = convertToNull

来解决这个问题

答案 4 :(得分:0)

我更新表时的解决方案

SET sql_mode='';
UPDATE tnx_k2_items
SET created_by = 790
, modified = '0000-00-00 00:00:00'
, modified_by = 0

答案 5 :(得分:-1)

不用说,你做错了。如果您打算不存储任何内容,该列应该可以为空,并且当您应该使用NULL时,不应该尝试插入空字符串。

考虑一下,但是:

如果严格模式不起作用,MySQL会为无效值或缺失值插入调整后的值并生成警告。 但是当严格模式生效时......

对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES时,数据更改语句中的值无效或缺失时会发生错误。该声明已中止并回滚

http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict SELECT @@ SQL_MODE;应该显示你正在运行(至少)STRICT_TRANS_TABLES。虽然这不是5.6中的内部默认值,但它包含在默认的5.6配置文件中。如果您想要旧的行为,您将要删除它并重新启动服务器。

...虽然你应该考虑使你的代码表现得更正确。

尝试启用此

ALLOW_INVALID_DATES

http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sqlmode_allow_invalid_dates

注意:我不建议这样做。我只是回答如何做到这一点。在我看来,最好清理查询和数据,并为非空的列提供良好的默认值。