Error in mysql when setting default value for DATE or DATETIME
我运行的是MySQLServer5.7.11,这句话是:
不工作。给出错误:
号
但以下内容:
只是工作而已。
同样的情况。
作为旁注,MySQL文档中提到:
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
号
即使他们也说:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the"zero" value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
号
考虑到MySQL文档中的第二个引用,有人能告诉我为什么会出现这种错误吗?
错误是因为SQL模式,根据最新的MySQL5.7文档,该模式可以是严格模式。
mysql文档5.7说:
Strict mode affects whether the server permits '0000-00-00' as a valid date:
If strict mode is not enabled, '0000-00-00' is permitted and inserts produce no warning.
If strict mode is enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning.
号
检查mysql模式
禁用严格传输表模式
但是,要允许使用
按命令
埃多克斯1〔2〕
或
埃多克斯1〔3〕
使用关键字
如果上述不起作用,则转到
另外,如果要在服务器启动时永久设置SQL模式,那么在Linux或MacOS上的
注释
但是,在MySQL5.6中,默认情况下不启用严格模式。因此,根据MySQL6文档,它不会产生错误
MySQL permits you to store a"zero" value of '0000-00-00' as a"dummy date." This is in some cases more convenient than using NULL values, and uses less data and index space. To disallow '0000-00-00', enable the NO_ZERO_DATE SQL mode.
号
更新
关于@dylan su所说的bug问题:
我不认为这是一个bug,它是MySQL随着时间的推移而发展的方式,因为有些东西是根据产品的进一步改进而改变的。
但是,我有另一个关于
日期时间字段现在不接受默认值()。
另一个有用的注释[请参见时间戳和日期时间的自动初始化和更新]
As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
号
关于无零日期的更新
从5.7.4开始的MySQL,不推荐使用此模式。对于以前的版本,您必须注释掉配置文件中的相应行。参考MySQL5.7文档
我在WAMP3.0.6和MySQL5.7.14中遇到了这个错误。
解决方案:
将
1 | sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER" |
号
到
1 | sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER" |
重新启动所有服务。
这将禁用严格模式。根据文件,"严格模式"是指启用或同时启用
"The default SQL mode in MySQL 5.7 includes these modes:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and
NO_ENGINE_SUBSTITUTION."
号
我遇到了这样一种情况:日期字段的数据混合在空值和0000-00-00之间。但我不知道如何将"0000-00-00"更新为空,因为
。
不再允许。我的解决方法很简单:
因为所有不正确的
加上一行:
内部文件:
然后是
配置语法问题
在*nix系统下的某些MySQL版本(测试5.7.*)上,应使用以下语法:
1 2 3 | [mysqld] sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION" |
。这些不起作用:
短划线无引号
1 | sql-mode=NO_ENGINE_SUBSTITUTION |
下划线无引号
1 | sql_mode=NO_ENGINE_SUBSTITUTION |
。
下划线和引号
1 | sql_mode="NO_ENGINE_SUBSTITUTION" |
。
对配置值和SQL模式的更完整的检查:
如何设置永久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'
号
然后设置不带
1 |
号
如果您有赠款,您也可以为
适用于5.7.8:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'); Query OK, 0 rows affected (0.01 sec) mysql> show create table t1; +-------+-------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+-------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.8-rc | +-----------+ 1 row in set (0.00 sec) |
您可以创建一个sqlfiddle来重新创建您的问题。
http://sqlfiddle.com/
如果它适用于MySQL5.6和5.7.8,但在5.7.11失败。那么它可能是5.7.11的回归错误。
这个答案只适用于MySQL5.7:
best在sql_模式下并不是真正设置为空的,而是在php中使用会话变量:
所以至少你保留了另一个默认值。
MySQL文档不清楚真是太疯狂了,您需要在SQL_模式下删除这个失败值:
我明白,没有零日期,没有零日期,但在未来的版本中,这将被终止。
在参数被忽略之前,用这个来严格定义所有的表,所以你也需要删除它。
最后也是传统的,但是文档中提到了这个参数:"在向列中插入不正确的值时给出错误而不是警告",使用这个参数,没有插入值为零的日期,但是没有"是"。
MySQL并没有真正使用这些参数和组合进行组织。
1 |
。
不投掷:
抛出:
我在Ubuntu上的
1 2 | [mysqld] sql_mode ="STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" |
。
使用mysql workbench解决问题(在服务器端应用解决方案后):
在"首选项"面板中将"SQL_模式"删除为"传统"。
。