我运行的是MySql服务器5.7.11,这句话是:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
不工作吗?给出错误:
ERROR 1067 (42000): Invalid default value for 'updated'
但以下各点:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
只是在工作。
同样的约会案件。
作为一个侧面,MySQL文档中提到了这一点:
日期类型用于日期部分的值,但不用于时间部分。MySQL检索并以‘YYYY DD’格式显示日期值.支持范围为“1000-01-01”到“9999-12-31”。
即使他们也说:
无效的日期、日期或时间戳值转换为相应类型(“0000-00-00”或“0000-00-00:00:00”)的“零”值。
考虑到MySQL文档的第二个引用,有人能让我知道为什么会出现这个错误吗?
发布于 2016-04-02 06:46:59
错误是因为sql模式,它可以是严格的模式,如最新的MYSQL 5.7文档所示
严格模式会影响服务器是否允许“0000-00-00”作为有效日期:如果不启用严格模式,则允许“0000-00-00”,并且插入不会产生警告。如果启用了严格模式,则“0000-00-00”是不允许的,插入也会产生错误,除非同时给出忽略。对于插入忽略和更新忽略,允许“0000-00-00”,插入将产生警告。
检查MYSQL模式
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
禁用STRICT_TRANS_TABLES模式
但是,要允许格式0000-00-00 00:00:00
,您必须在mysql配置文件或命令中禁用STRICT_TRANS_TABLES模式。
By命令
SET sql_mode = '';
或
SET GLOBAL sql_mode = '';
使用关键字GLOBAL
需要超级工具,从那时起它会影响所有客户端连接的操作。
如果上面没有工作,请转到/etc/mysql/my.cnf
(如per )并注释掉STRICT_TRANS_TABLES
。
另外,如果您希望在服务器启动时永久设置sql模式,那么在Linux或SET sql_mode=''
上的my.cnf
中包括my.cnf
。对于windows,这必须在my.ini
文件中完成。
Note
但是,在MYSQL 5.6中,默认情况下不启用严格模式。因此,它不会像MYSQL 6文档那样产生错误。
MySQL允许您将“零”值“0000-00-00”存储为“虚拟日期”。在某些情况下,这比使用空值更方便,并且使用更少的数据和索引空间。若要不允许“0000-00-00”,请启用NO_ZERO_DATE SQL模式。
更新
关于臭虫的问题,正如@Dylan所说:
我不认为这是一个bug,它是随着时间的推移而演变的MYSQL的方式,由于这些原因,一些事情是根据产品的进一步改进而改变的。
但是,关于NOW()
函数,我有另一个相关的bug报告
另一个有用的注意事项[见时间戳和日期时间的自动初始化和更新]
从MySQL 5.6.5开始,时间戳和日期时间列可以自动初始化并更新到当前日期和时间(即当前时间戳)。在5.6.5之前,这只适用于时间戳,每个表最多只有一个时间戳列。下面的说明首先描述MySQL 5.6.5及更高版本的自动初始化和更新,然后描述5.6.5之前版本的不同之处。
关于 NO_ZERO_DATE的更新
从5.7.4开始,MySQL就不再推荐这种模式了。对于以前的版本,您必须注释掉配置文件中的相应行。参考日期
发布于 2016-10-16 12:22:42
使用MySql 5.7.14时,WAMP 3.0.6出现了此错误。
解决方案:
更改c:\wamp\bin\mysql\mysql5.7.14\my.ini
文件中的第70行(如果ini文件未被触摸),请从
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
至
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
并重新启动所有服务。
这将禁用严格模式。根据文档,“严格模式”是指启用了STRICT_TRANS_TABLES
或STRICT_ALL_TABLES
或两者之一的模式。文档说:
MySQL 5.7中的默认SQL模式包括以下模式: 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。
发布于 2018-10-22 05:54:36
我遇到了一种情况,即日期字段的数据介于NULL和0000-00-00之间。但我不知道如何将“0000-00-00”更新为空,因为
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
不再被允许了。我的解决办法很简单:
update my_table set my_date_field=NULL where my_date_field<'0000-01-01'
因为所有不正确的my_date_field
值(无论是否正确的日期)都来自于此日期之前。
https://stackoverflow.com/questions/36374335
复制相似问题