在mysql中设置日期或日期时间的默认值时出错

uqxowvwt  于 2021-06-24  发布在  Mysql
关注(0)|答案(12)|浏览(339)

我运行的是mysql server 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-mm-dd”格式显示日期值。支持的范围是“1000-01-01”到“9999-12-31”。
即使他们也说:
无效的日期、日期时间或时间戳值将转换为相应类型的“零”值(“0000-00-00”或“0000-00-00:00”)。
考虑到mysql文档中的第二句话,有人能告诉我为什么会出现这样的错误吗?

eanckbw9

eanckbw91#

以下答案仅适用于MySQL5.7:
best并不是在sql\ U模式下设置为空,而是在php中使用一个会话变量:

SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

所以至少你保留了另一个默认值。
mysql文档不清晰很疯狂,您需要在sql\模式下删除此default值:
我明白,没有日期,没有日期,但在未来的版本中,这将停止。
严格的\u所有的\u表,有了这个,之前的参数都会被忽略,所以你也需要删除它。
最后也是传统的,但是文档中提到了这个参数:“在向列中插入不正确的值时,给出一个错误而不是一个警告”,使用这个参数,不插入值为零的日期,但不插入yes。
mysql并不是真正用这些参数和组合来组织的。

ercv8c1e

ercv8c1e2#

首先选择当前会话 sql_mode :

SELECT @@SESSION.sql_mode;

然后您将得到类似于默认值的值:
'仅\u完整\u分组依据,严格\u事务表,没有\u零\u在\u日期,没有\u零\u日期,错误\u按\u零除\u,没有\u自动创建\u用户,没有\u引擎\u替换'
然后设置 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';

如果你有助学金,你也可以这样做 GLOBAL :

SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
ppcbkaq5

ppcbkaq53#

配置语法问题

nix系统下的某些mysql版本(测试版本为5.7.)上,应使用以下语法:

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"

这些不起作用:

破折号无引号

sql-mode=NO_ENGINE_SUBSTITUTION

下划线无引号

sql_mode=NO_ENGINE_SUBSTITUTION

下划线和引号

sql_mode="NO_ENGINE_SUBSTITUTION"

对配置值和sql模式的更全面的回顾:
如何设置永久sql模式标志

nbnkbykc

nbnkbykc4#

我在wamp3.0.6和mysql 5.7.14中遇到了这个错误。
解决方案:
更改中的第70行(如果ini文件未被触及) c:\wamp\bin\mysql\mysql5.7.14\my.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 启用。文件上说:
MySQL5.7中的默认sql模式包括以下模式:仅\u full \u group \u by、strict \u trans \u tables、no \u zero \u in \u date、no \u zero \u date、error \u for \u division \u by \u zero、no \u auto \u create \u user和no \u engine \u substitution

w41d8nur

w41d8nur5#

使用mysql workbench解决问题(在服务器端应用解决方案之后):
在“首选项”面板中将sql模式删除为“传统”。

s4chpxco

s4chpxco6#

在diretory xamp/mysql/bin中打开“my.ini”并更改行:sql\u node for->
sql模式=没有引擎替换,没有零日期
删除“日期中没有0”

kiayqfof

kiayqfof7#

选项组合 mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) .
不会抛出: STRICT_TRANS_TABLES + NO_ZERO_DATE 抛出: STRICT_TRANS_TABLES + NO_ZERO_IN_DATE 我的设置 /etc/mysql/my.cnf 在ubuntu上:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
kwvwclae

kwvwclae8#

只要加上一行: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 内部文件: /etc/mysql/mysql.conf.d/mysqld.cnf 那么 sudo service mysql restart

umuewwlo

umuewwlo9#

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

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

因为所有这些都是错误的 my_date_field 值(无论日期是否正确)来自此日期之前。

gg0vcinb

gg0vcinb10#

适用于5.7.8:

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的回归bug。

h5qlskok

h5qlskok11#

错误是因为sql模式,根据最新的mysql 5.7文档,sql模式可以是严格模式
mysql文档5.7说:
严格模式影响服务器是否允许“0000-00-00”作为有效日期:如果未启用严格模式,则允许“0000-00-00”并且插入不会产生警告。如果启用了严格模式,则不允许使用“0000-00-00”,并且插入会产生错误,除非同时给出ignore。对于insert ignore和update ignore,允许使用“0000-00-00”,insert会产生警告。
检查mysql模式 SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session 禁用严格转换表模式
但是允许格式 0000-00-00 00:00:00 您必须在mysql配置文件中或通过命令禁用strict\u trans\u 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 文件。
笔记
但是,MySQL5.6默认情况下不启用严格模式。因此,根据mysql 6文档,它不会产生错误
mysql允许您将“0”值“0000-00-00”存储为“伪日期”。这在某些情况下比使用空值更方便,并且使用更少的数据和索引空间。若要禁用“0000-00-00”,请启用无零日期sql模式。
更新
关于@dylan su所说的bug问题:
我不认为这是一个错误,它的方式mysql是随着时间的推移,由于一些东西是改变的基础上进一步改进的产品。
不过,我有另一个有关的错误报告 NOW() 功能
datetime字段现在不接受默认值()
另一个有用的注解[请参阅timestamp和datetime的自动初始化和更新]
从mysql 5.6.5开始,timestamp和datetime列可以自动初始化并更新为当前日期和时间(即当前时间戳)。在5.6.5之前,这只适用于timestamp,并且每个表最多有一个timestamp列。下面的注解首先描述MySQL5.6.5及更高版本的自动初始化和更新,然后是5.6.5之前版本的区别。
关于无零日期的更新
从5.7.4开始,mysql就不再支持这种模式。对于以前的版本,必须注解掉配置文件中的相应行。请参阅MySQL5.7文档中的no\ u zero\ u date

qlzsbp2j

qlzsbp2j12#

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

相关问题