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文档可以是严格模式
严格模式会影响服务器是否允许'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.cnf
Linux或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()
功能的相关错误报告
另一个有用的注释 [参见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文档
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_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."
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)
我遇到了一种情况,其中数据混合在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
值(无论是否正确的日期)都来自该日期之前。
在 *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 的更完整回顾: