设置DATE或DATETIME的默认值时,mysql出错

Evh*_*vhz 106 mysql sql console datetime date

我正在运行MySql Server 5.7.11和这句话:

updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
Run Code Online (Sandbox Code Playgroud)

不是工作.给出错误:

ERROR 1067 (42000): Invalid default value for 'updated'
Run Code Online (Sandbox Code Playgroud)

但是以下内容:

updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
Run Code Online (Sandbox Code Playgroud)

只是工作.

DATE的情况相同.

作为旁注,它在mysql文档中提到:

DATE类型用于具有日期部分但没有时间部分的值.MySQL以'YYYY-MM-DD'格式检索并显示DATE值.支持的范围是"1000-01-01"到"9999-12-31".

即使他们也说:

无效的DATE,DATETIME或TIMESTAMP值将转换为相应类型的"零"值('0000-00-00'或'0000-00-00 00:00:00').

考虑到mysql文档的第二个引用,任何人都可以让我知道它为什么会出现这个错误?

gee*_*sal 181

该错误是因为sql模式,根据最新的MYSQL 5.7文档可以是严格模式

MySQL文档5.7说:

严格模式会影响服务器是否允许'0000-00-00'作为有效日期:如果未启用严格模式,则允许使用'0000-00-00'并且插入不会产生警告.如果启用了严格模式,则不允许使用'0000-00-00',并且插入会产生错误,除非同时给出了IGNORE.对于INSERT IGNORE和UPDATE IGNORE,允许使用'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模式

按命令

SET sql_mode = '';

要么

SET GLOBAL sql_mode = '';

使用关键字GLOBAL需要超级优势,它会影响所有客户端从那时起连接的操作

如果上面的工作不起作用/etc/mysql/my.cnf(按照ubuntu)并注释掉STRICT_TRANS_TABLES

另外,如果你想永久设置在服务器启动时的SQL模式,然后包括SET sql_mode=''my.cnfLinux或MacOS的.对于Windows,这必须在my.ini文件中完成.

注意

但是,默认情况下,MYSQL 5.6中未启用严格模式.因此,根据MYSQL 6文档,它不会产生错误

MySQL允许您将"0000-00-00"的"零"值存储为"虚拟日期".这在某些情况下比使用NULL值更方便,并且使用更少的数据和索引空间.要禁止'0000-00-00',请启用NO_ZERO_DATE SQL模式.

UPDATE

关于@ Dylan-Su所说的bug问题:

我不认为这是MYSQL随着时间的推移而发展的错误,因为根据产品的进一步改进,一些事情会发生变化.

但是,我有另一个关于该NOW()功能的相关错误报告

日期时间字段不接受默认NOW()

另一个有用的注释 [参见TIMESTAMP和DATETIME的自动初始化和更新 ]

从MySQL 5.6.5开始,TIMESTAMP和DATETIME列可以自动初始化并更新为当前日期和时间(即当前时间戳).在5.6.5之前,这仅适用于TIMESTAMP,并且每个表最多只有一个TIMESTAMP列.以下注释首先描述MySQL 5.6.5及更高版本的自动初始化和更新,然后是5.6.5之前版本的差异.

有关NO_ZERO_DATE的更新

从5.7.4开始,MySQL不推荐使用此模式.对于以前的版本,您必须注释掉配置文件中的相应行.请参阅NO_ZERO_DATE上的MySQL 5.7文档

  • 更新IGNORE是我一直在寻找的 (5认同)
  • 错误.我的两个MySQL实例,本地和服务器都有`STRICT_TRANS_TABLES`.但是,我可以轻松地在我的本地实例中插入`0000-00-00`,但不能在我的服务器实例中 - 抛出错误.为什么?因为我的服务器MySQL配置启用了"NO_ZERO_DATE".而我的当地人没有它. (2认同)
  • 在我的情况下,'SET sql_mode =“”'不起作用。'SET GLOBAL sql_mode =“”;' 为我做了工作。 (2认同)

bg1*_*7aw 16

使用WAMP 3.0.6和MySql 5.7.14时出现此错误.

方案:

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"
Run Code Online (Sandbox Code Playgroud)

sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
Run Code Online (Sandbox Code Playgroud)

并重新启动所有服务.

这将禁用严格模式.根据文档,"严格模式"表示具有一个或两个STRICT_TRANS_TABLESSTRICT_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."


sim*_*eco 10

首先选择当前会话sql_mode

SELECT @@SESSION.sql_mode;
Run Code Online (Sandbox Code Playgroud)

然后你会得到类似默认值的东西:

'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'

然后设置sql_mode没有'NO_ZERO_DATE'

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Run Code Online (Sandbox Code Playgroud)

如果您有赠款,您也可以为GLOBAL

SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
Run Code Online (Sandbox Code Playgroud)


Mar*_* T. 8

我遇到了一种情况,其中数据混合在NULL和Registry的日期字段之间。但是我不知道如何将'0000-00-00'更新为NULL,因为

 update my_table set my_date_field=NULL where my_date_field='0000-00-00'
Run Code Online (Sandbox Code Playgroud)

不再允许。我的解决方法非常简单:

update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
Run Code Online (Sandbox Code Playgroud)

因为所有不正确的my_date_field值(无论是否正确的日期)都来自该日期之前。

  • 完美的快速解决方案。实际上,您也可以使用&lt;&lt; 0000-01-01',因为它当然是有效日期。 (2认同)

Her*_*him 5

配置语法问题

在 *nix 系统下的某些 MYSQL 版本(已测试 5.7.*)上,您应该使用以下语法:

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

这些将不起作用:

破折号没有引号

sql-mode=NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

下划线没有引号

sql_mode=NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

下划线和引号

sql_mode="NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

对配置值和 sql-mode 的更完整回顾:

如何设置永久的 Sql 模式标志