2017-04-24 60 views
1

我想在MySQL中允许零日期。我已将sql_mode更改为ALLOW_INVALID_DATES,NO_ENGINE_SUBSTITUTIONmysql - 需要允许'0000-00-00 00:00:00'日期

我已将其更改为/etc/mysql/my.cnf

然而,我当我尝试插入数据出现错误,

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

的MySQL版本是5.7.18。

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

+2

哪些数据是,当这个错误发生在你插入?为什么你需要允许无效的日期? –

+1

您是否重新启动服务器? – Igor

+0

嗯,我想'varchar'领域。那么,为什么你不使用'varchar'?当你执行选择,更新,删除,......你可以用'日期转换()''一样SELECT ID FROM MY_TABLE其中date(my_date_1)> DATE(my_date_2)ORDER BY DATE(my_date_3)DESC' ... 而...您可以检查是否是零日期像'WHERE my_date_1 =“0000-00-00 00:00:00'' –

回答

-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

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

+0

OP已启用ALLOW_INVALID_DATES。这正是问题:启用了ALLOW_INVALID_DATES,但是当使用零日期时,MySQL提供了一个错误。 – Shadow

0

,我要在这里假设你想有一个有效的日期,使您的查询从来没有检查NULL 。

做到这一点的一种方法是使用我喜欢称为“永久”日期的东西。

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

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

the Mysql manual

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

所以,一种可能适合你的方法是利用'1000-01-01 00:00:00'而不是零日期。