Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >explicit_defaults_for_timestamp参数详解

explicit_defaults_for_timestamp参数详解

作者头像
MySQL技术
发布于 2019-09-08 01:37:51
发布于 2019-09-08 01:37:51
4.6K00
代码可运行
举报
文章被收录于专栏:MySQL技术MySQL技术
运行总次数:0
代码可运行

简介:

explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。此变量自MySQL 5.6.6 版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF。本文主要介绍该参数打开和关闭情况下对timestamp的影响 。

1.explicit_defaults_for_timestamp = OFF

当该参数默认设置为OFF时,其行为如下:

  • 在默认情况下,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
  • 表中的第一个timestamp列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
  • 对于其它TIMESTAMP列,如果没有显示指定NULL和DEFAULT属性的话,会自动设置为NOT NULL DEFAULT '0000-00-00 00:00:00'。(当然,这个与SQL_MODE有关,如果SQL_MODE中包含'NO_ZERO_DATE',实际上是不允许将其默认值设置为'0000-00-00 00:00:00'的。)

下面我们来测试下:(本文操作基于MySQL5.7.23 版本 SQL_MODE不包含'NO_ZERO_DATE')

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show variables like 'explicit_defaults_for_timestamp';+---------------------------------+-------+| Variable_name                   | Value |+---------------------------------+-------+| explicit_defaults_for_timestamp | OFF   |+---------------------------------+-------+
mysql> create table t1     -> (    -> ts1 timestamp,    -> ts2 timestamp,    -> ts3 timestamp default '2010-01-01 00:00:00'    -> );Query OK, 0 rows affected (0.03 sec)
mysql> show create table t1\G*************************** 1. row ***************************       Table: t1Create Table: CREATE TABLE `t1` (  `ts1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `ts2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  `ts3` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00') ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)
mysql> insert into t1 values (null,null,null);Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;+---------------------+---------------------+---------------------+| ts1                 | ts2                 | ts3                 |+---------------------+---------------------+---------------------+| 2019-04-09 15:54:56 | 2019-04-09 15:54:56 | 2019-04-09 15:54:56 |+---------------------+---------------------+---------------------+1 row in set (0.00 sec)

从表结构来看,MySQL自动为第一个timestamp字段自动设置NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性,而后面的timestamp字段,若没有指定,则设置了 NOT NULL DEFAULT '0000-00-00 00:00:00'属性。如果向timestamp这个列中插入null值,系统会自动的设置该列的值为current timestamp值。即explicit_defaults_for_timestamp=OFF时,即使timestamp列设为NOT NULL也能插入NULL值,系统会自动将NULL值设为current timestamp。

2.explicit_defaults_for_timestamp = ON

当该参数设置为ON时,其行为如下:

  • 如果timestamp列没有显式的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。
  • 不会自动的为表中的第一个timestamp列加上DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP属性。
  • 如果timestamp列被加上了not null属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该TIMESTAMP列指定值的时候,如果strict sql_mode被指定了,那么会直接报错。如果strict sql_mode没有被指定,那么会向该列中插入'0000-00-00 00:00:00'并且产生一个warning。

同样的,我们来测试下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show variables like 'explicit_defaults_for_timestamp';+---------------------------------+-------+| Variable_name                   | Value |+---------------------------------+-------+| explicit_defaults_for_timestamp | ON    |+---------------------------------+-------+mysql> create table t2     -> (    -> ts1 timestamp,    -> ts2 timestamp,    -> ts3 timestamp default '2010-01-01 00:00:00'    -> );Query OK, 0 rows affected (0.02 sec)
mysql> show create table t2\G*************************** 1. row ***************************       Table: t2Create Table: CREATE TABLE `t2` (  `ts1` timestamp NULL DEFAULT NULL,  `ts2` timestamp NULL DEFAULT NULL,  `ts3` timestamp NULL DEFAULT '2010-01-01 00:00:00') ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.01 sec)
mysql> insert into t2 values (null,null,null);Query OK, 1 row affected (0.01 sec)
mysql> select * from t2;+------+------+------+| ts1  | ts2  | ts3  |+------+------+------+| NULL | NULL | NULL |+------+------+------+1 row in set (0.00 sec)
-- 指定NOT NULLmysql> create table t3     -> (    -> ts1 timestamp,    -> ts2 timestamp,    -> ts3 timestamp not null    -> );Query OK, 0 rows affected (0.01 sec)
mysql> show create table t3\G*************************** 1. row ***************************       Table: t3Create Table: CREATE TABLE `t3` (  `ts1` timestamp NULL DEFAULT NULL,  `ts2` timestamp NULL DEFAULT NULL,  `ts3` timestamp NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.01 sec)
mysql> insert into t3 values (null,null,null);ERROR 1048 (23000): Column 'ts3' cannot be null
mysql> insert into t3 (ts1,ts2) values (null,null);Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;+---------+------+------------------------------------------+| Level   | Code | Message                                  |+---------+------+------------------------------------------+| Warning | 1364 | Field 'ts3' doesn't have a default value |+---------+------+------------------------------------------+
mysql> select * from t3;+------+------+---------------------+| ts1  | ts2  | ts3                 |+------+------+---------------------+| NULL | NULL | 0000-00-00 00:00:00 |+------+------+---------------------+

从表结构上看出,在参数开启的情况下MySQL默认会为timestamp列添加 null default null属性,而且MySQL也没有为第一个timestamp字段设置该列为current timestamp值。timestamp 字段写入null值,写入之后存储的就是null值,而不是当前的时间。当timestamp 字段指定NOT NULL时,若显式插入NULL则报错提示:该字段不能为空;若不显式插入该字段且SQL_MODE不包含'NO_ZERO_DATE',则会向该列中插入'0000-00-00 00:00:00'并且产生一个warning。

总结:

实际情况下,我们经常会这样创建表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `table_name` (  `increment_id` INT UNSIGNED NOT NULL auto_increment COMMENT '自增主键',  ...  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',  PRIMARY KEY (`increment_id`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

此时timestamp字段会指定NOT NULL,这时建议explicit_defaults_for_timestamp 参数采用默认的OFF,这样当timestamp字段显式插入NULL值时不报错,特别是程序sql写的不规范时,可以避免程序插入报错。

在不同环境间,此参数建议统一 ,不然可能出现程序在这个环境运行正常 在另外一个环境却出现报错的情况。笔者了解到亚马逊RDS MySQL5.7实例该参数默认为ON,在环境迁移时要特别注意下该参数。

参考:

http://suo.im/5bDU2o http://suo.im/4AJeM9

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微软发布ML.NET 1.0
原文地址:https://devblogs.microsoft.com/dotnet/announcing-ml-net-1-0/
张善友
2019/07/02
9580
.NET机器学习 ML.NET 1.4预览版和模型生成器更新
ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架。 ML.NET 还包括Model Builder (一个简单的UI工具)和 CLI ,使用自动机器学习(AutoML)构建自定义机器学习(ML)模型变得非常容易。
张善友
2020/06/19
1.9K0
.NET机器学习 ML.NET 1.4预览版和模型生成器更新
使用C# 探索 ML.NET 中的不同机器学习任务
ML.NET 是 Microsoft 开源的针对 .NET 应用程序的 跨平台机器学习库,允许您使用 C#、F# 或任何其他 .NET 语言执行机器学习任务。此外,ML.NET 支持在其他机器学习框架中构建的模型,如TensorFlow,ONNX,PyTorch 等,它也具有极高的性能,可用于各种机器学习任务。
张善友
2022/03/30
1.5K0
使用C# 探索 ML.NET 中的不同机器学习任务
.NET开发人员如何开始使用ML.NET
随着谷歌,Facebook发布他们的工具机器学习工具Tensorflow 2和PyTorch ,微软的CNTK 2.7之后不再继续更新(https://docs.microsoft.com/zh-cn/cognitive-toolkit/releasenotes/cntk_2_7_release_notes),Build 2019 微软也发布了ML.NET 1.0 ,这是一个面向机器学习开发者的新框架。可以说2019年是机器学习社区普及化的一年,所有的这些发布清楚地表明了IT行业的发展方向。从数据集改进模型到新的模型更新,以及优化硬件。
张善友
2019/07/02
1.2K0
AI与.NET技术实操系列(二):开始使用ML.NET
在当今技术飞速发展的时代,机器学习(Machine Learning, ML)已成为推动创新和变革的核心力量。从智能推荐系统到自动化决策工具,ML的应用无处不在,深刻影响着我们的生活和工作方式。对于.NET开发者而言,掌握ML技术不仅意味着紧跟潮流,更是在竞争激烈的市场中保持优势的关键。作为微软的旗舰开发平台,.NET通过ML.NET为开发者提供了一个强大且易于使用的机器学习框架,使他们能够在不离开熟悉的开发环境的情况下,构建、训练和部署ML模型。
AI.NET 极客圈
2025/03/20
1450
AI与.NET技术实操系列(二):开始使用ML.NET
ML.NET 3.0 增强了深度学习和数据处理能力
.NET团队在 2023.11.28 在博客上正式发布了 ML.NET 3.0::https://devblogs.microsoft.com/dotnet/announcing-ml-net-3-0/[1],强调了两个主要的兴趣点,即深度学习和数据处理,使开发人员能够完全在 .NET 生态系统中创建注入 AI 的应用程序。开源 ML.NET 框架[2]的主要卖点,旨在帮助开发人员能够使用C#和F#构建自定义ML模型并将其集成到应用程序中。这是通过命令行 (CLI) 和模型生成器等工具完成的,或者创建像大型语言模型 (LLM) 这样的结构来完成,这些模型为 ChatGPT 和 无处不在的“Copilot”AI 助手提供支持。
张善友
2023/12/06
4570
ML.NET 3.0 增强了深度学习和数据处理能力
现场 | 微软Build 2018亮点全揭晓:主推Azure、Microsoft 365,开源ML.Net
机器之心报道 作者:李九喻 微软开发者大会 Build 2018 于 7-9 日在西雅图的华盛顿会议中心举行,本文带你浏览大会第一天的核心亮点。 今年 Build 大会总共吸引 6000 名登记参加者,为期三天的大会将包括 3 个 主题演讲,180 多个分组会议以及 40 多个参展商,今年主推 Microsoft Azure 和 Microsoft 365,微软决心要让计算无处不在,打造多传感器和多设备的智能生态。 今年负责演讲的是 CEO 萨蒂亚·纳德拉、云服务部门负责人 Scott Guthrie、以
机器之心
2018/06/08
6670
机器学习 ML.NET 发布 1.0 RC
ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS),通过使用ML.NET,.NET开发人员可以利用他们现有的工具和技能组,为情感分析,推荐,图像分类等常见场景创建自定义机器学习模型,将开发自定义AI并注入其应用程序之中,微软.NET团队在官方博客[https://devblogs.microsoft.com/dotnet/announcing-ml-net-1-0-rc-machine-learning-for-net/]发布了ML.NET 1.0 RC(Release Candidate)(版本1.0.0-preview), 这是在2019年第二季度发布最终 ML.NET 1.0 RTM 之前的最后预览版本, 我猜测发布的时间点应该是微软5月6-8举办的 Build开发者大会上【https://www.microsoft.com/en-us/build】。下图是从2018年5月份开源发布ML.NET 0.1版本以来到1.0 RTM之前的预览时间图:
张善友
2019/07/02
6050
.NET 基金会项目介绍-ML.NET
ML.NET 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。
newbe36524
2020/03/16
7300
一个开源的,跨平台的.NET机器学习框架ML.NET
微软在Build 2018大会上推出的一款面向.NET开发人员的开源,跨平台机器学习框架ML.NET。 ML.NET将允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无需事先掌握开发或调整机器学习模型的专业知识。在采用通用机器学习语言(如R和Python)开发的模型,并将它们集成到用C#等语言编写的企业应用程序中需要付出相当大的努力。ML.NET填平了机器学习专家和软件开发者之间的差距,从而使得机器学习的平民化,即使没有机器学习背景的人们能够建立和运行模型。通过为.NET创建
张善友
2018/06/19
1.5K0
微软How old 侧颜值,今天你测了吗?
话不多说,先上图! 郭德纲赤裸裸被微软鄙视了。\(^o^)/ 以下是正文部分,逗个乐先! 微软靠颜值测年龄网站爆红 背后原理大揭秘 近来脸书上疯传「How Old Do I look?
CDA数据分析师
2018/02/23
1K0
微软How old 侧颜值,今天你测了吗?
译 | 宣布ML.NET 1.2 及模型生成器更新(用于 .NET 的机器学习)
我们很高兴地宣布ML.NET 1.2 和模型生成器和 CLI 的更新。ML.NET是 .NET 开发人员的开源和跨平台机器学习框架。ML.NET还包括模型生成器(Visual Studio 的简单 UI 工具)和ML.NET CLI(命令行界面),以便使用自动机器学习 (AutoML) 构建自定义机器学习 (ML) 模型变得超级简单。
Edi Wang
2019/07/22
1.1K0
译 | 宣布ML.NET 1.2 及模型生成器更新(用于 .NET 的机器学习)
[AI新知] 微软为Power平台加入AI Builder
微软为Power平台加入AI建置工具,让用户以少量程式码就能在企业App加入AI功能,人工智慧建置工具AI Builder提供用户二元分类、物体侦测以及文字分类等多种功能
阿泽
2019/07/04
1.2K0
C#开源跨平台机器学习框架ML.NET----介绍与环境搭建
现在学习机器学习这块时,基本上都是要先学习Python,还要自己去学习更多的样本数据教程,这样对于使用C#学习机器学习的基础并不容易,于是微软推出了ML.NET的开源跨平台机器学习框架。
Vaccae
2019/09/05
3.2K0
C#开源跨平台机器学习框架ML.NET----介绍与环境搭建
微软开源 ML.NET 跨平台机器学习框架,AI 普及又向前跨进一步
AI 研习社按,当地时间 5 月 7 日,微软 Build 大会在美国西雅图召开,会上微软针对开发者发布了一系列新产品。详细信息参见 Build 大会中的 AI:微软 AI 云服务全线更新。在这一系列产品发布的同时,AI 研习社注意到,微软同时宣布开源机器学习框架——ML.NET。利用 ML.NET,开发人员可以直接上手已有的模型,无需具备开发或调节机器学习模型的专业知识。
AI研习社
2018/07/26
4280
微软开源 ML.NET 跨平台机器学习框架,AI 普及又向前跨进一步
[AI新知] 强化站内搜寻与推荐服务,痞客邦运用云端技术加速AI演算法上线
近年台湾知名社群网站痞客邦开始使用AI打造更多元的服务,包括个人化文章推荐演算法等,而为了让新开发的演算法可以更快上线,他们也积极运用云端技术来克服过去流程的问题,让部署过程变成只要1天。
阿泽
2019/06/21
7380
[AI新知]  强化站内搜寻与推荐服务,痞客邦运用云端技术加速AI演算法上线
[AI新知] FaceBook开源机器人控制框架PyRobot
FaceBook希望透过释出高阶抽象的控制框架PyRobot,降低研究人员控制机器人的障碍,以加速机器人生态系整体研究的进展
阿泽
2019/07/11
1.7K0
[AI新知] FaceBook开源机器人控制框架PyRobot
使用ML.NET模型生成器来完成图片性别识别
ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。 借助此功能,可以使用应用程序的可用数据进行自动预测。 机器学习应用程序利用数据中的模式来进行预测,而不需要进行显式编程。
雪雁-心莱科技
2020/11/02
1.6K0
使用ML.NET模型生成器来完成图片性别识别
C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”
SciSharp 是怎样的一个社区?它是如何构建一个基于 .NET 的机器学习生态?它在做的事情对开发者来说有何意义?本次,AI 科技大本营与 SciSharp 核心团队成员,包括 SciSharp 社区产品运营负责人,原 “微信”技术专利发明人George Zhao、 TensorFlow.NET 发起人和主要贡献者Eric Chen、NumSharp 主要贡献者 Eli Belash、Torch.NET与Numpy.NET的主要贡献者Meinrad Recheis和 ICSharpCore主要贡献者Kerry Jiang聊了聊,更加深入地了解这个 AI 社区及其产品。
AI科技大本营
2019/10/28
2.9K0
C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”
ML-Framework:ML.NET 0.3 带来新组件
ML.NET在今年微软在Build 2018 会议上宣布的机器学习框架现已正式推出0.3版本 https://github.com/dotnet/machinelearning/releases/tag/v0.3.0 。Microsoft希望.NET开发人员能够设计自己的ML模型并将其集成到他们的应用程序中,而无需构建特定的专有技术,让AI技术平民化。ML.NET 0.3现在提供了许多用于训练机器学习模型的新组件以及以流行的ONNX格式导出模型的选项,当然还包括了许多Bug修复。
张善友
2018/07/24
4910
ML-Framework:ML.NET 0.3 带来新组件
推荐阅读
相关推荐
微软发布ML.NET 1.0
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验