MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

2023-05-16

MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

  • DATE日期类型
  • DATETIME和TIMESTAMP的不同
    • 什么是时区自动变动?
  • DATETIME和TIMESTAMP的相同点
    • 微秒小数部分
    • 自动初始化和更新
    • 宽松的日期格式识别
  • 其他规则
    • 两位数年份规则
    • 无效的日期输入值
  • 总结

DATE日期类型

简单的来说,DATE表示的是没有时间的日期,以’YYYY-MM-DD’格式检索和显示值 。
而DATETIME和TIMESTAMP都是表示日期和时间,以’YYYY-MM-DD hh:mm:ss’格式检索和显示值。

相对来说,DATE类型很简单,下面主要解释下DATETIME和TIMESTAMP的相同点和不同点。

DATETIME和TIMESTAMP的不同

两种时间类型都可以表示日期和时间,都能保留到微妙(6位)精度,都支持自动初始化和更新,这些会在之后详细解释。

它们的不同点如下表所示:

不同点DATETIEMTIMESTAMP
取值范围‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’‘1970-01-01 00:00:01’~‘2038-01-19 03:14:07’
是否支持时区自动变动不支持支持UTC时区自动变动

在之前的版本中TIMESTAMP相交DATETIME来说还可以自动初始化和更新,但是在8.0之后TIMESTAMP和DATETIME都支持了自动初始化和更新。所以比较重要的区别就在于是否支持时区自动变动。

什么是时区自动变动?

假设当前为UTC+8:00时区,分别以DATETIME和TIMESTAMP存入时间为2019-01-01 12:00:00
当时区切换为UTC+7:00时区时:

时间类型日期时间
DATETIME2019-01-01 12:00:00
TIMESTAMP2019-01-01 11:00:00

当切换回UTC+8:00时:

时间类型日期时间
DATETIME2019-01-01 12:00:00
TIMESTAMP2019-01-01 12:00:00

DATETIME和TIMESTAMP的相同点

微秒小数部分

DATETIME或TIMESTAMP 值可以包括高达微秒(6位)精度的尾随小数秒部分。特别是,插入到一个DATETIME或一 TIMESTAMP列中的值中的任何小数部分都被存储而不是被丢弃。与包括分数部分,这些类型的格式为:
DATETIME:   ‘1000-01-01 00:00:00.000000’~‘9999-12-31 23:59:59.999999’
TIMESTAMP:‘1970-01-01 00:00:01.000000’~‘2038-01-19 03:14:07.999999’

自动初始化和更新

TIMESTAMP和 DATETIME列可以自动初始化并更新为当前日期和时间(即当前时间戳)。
并且可以分别设定是否具有默认值和是否会被自动更新值。
我们可以通过以下代码来实现自动初始化默认值和自动更新值

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

其中,DEFAULT 为设置自动初始化默认值,可以为常量定值,也可以使用CURRENT_TIMESTAMP设置为当前时间戳。
ON UPDATE CURRENT_TIMESTAMP为设置自动更新当前时间戳。
两个配置语句前后顺序无关紧要。

在之前的版本中,TIMESTAMP可以通过为他们赋值NULL而实现自动更新时间戳,在8.0版本之后,默认情况下,会直接赋值为NULL,如果设置为NOT NULL属性,也会进行报错。
如果需要兼容之前版本的自动更新,可以将explicit_defaults_for_timestamp禁用,才可以使用非标准行为,但是非标准行为,会在未来版本的MySQL中弃用。

NOTE: CURRENT_TIMESTAMP 直接写在 SQL 中 IDEA会提示

CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().

翻译过来就是,CURRENT_TIMESTAMPCURRENT_TIMESTAMP()NOW()是相同的

所以可以用 NOW()来替换上述SQL 中的CURRENT_TIMESTAMP
具体可以参看这篇博客:一文看懂mysql时间函数now()、current_timestamp() 和sysdate()

宽松的日期格式识别

作为字母’YYYY-MM-DD hh:mm:ss’或’YY-MM-DD hh:mm:ss’格式的字符串 。允许使用 “ 宽松 ”语法:
任何标点符号都可以用作日期部分之间的分隔符。例如,‘2012-12-31 11:30:45’, ‘2012^12^31 11+30+45’, ‘2012/12/31 113045’,和 '2012@12@31 11^30^45’是相等的。

作为字符串中没有分隔符 'YYYYMMDDhhmmss’或 'YYMMDDhhmmss’格式的字符串,前提是该字符串作为日期有意义。例如, '20070523091528’并且 '070523091528’被解释为 ‘2007-05-23 09:15:28’,但是 ‘071122129015’非法(它具有无意义的微小部分)并且变为’0000-00-00 00:00:00’。

作为数字 YYYYMMDDhhmmss或 YYMMDDhhmmss格式的数字,只要该数字作为日期有意义。例如, 19830905132800并被 830905132800解释为 ‘1983-09-05 13:28:00’。

其他规则

两位数年份规则

如果日期年份输入只有两位数,那么MySQL会按照以下规则解释两位数的年份:

  • 范围00-69中的年份值将转换为2000-2069
  • 范围70-99中的年份值将转换为1970-1999

无效的日期输入值

无效的DATE, DATETIME或 TIMESTAMP值将转换为适当类型(或)的 “ 零 ”值。 ‘0000-00-00’‘0000-00-00 00:00:00’

总结

  • 尽量不要使用timestamp,因为只支持到2038年,今年已经2020年了,只有18年的寿命
  • 最近项目中涉及到跨时区的业务处理,所以如果需要考虑前后端时区一致问题,建议使用datatime ,把所有的时区问题交由代码和前后端管理,而不是通过配置数据库时区来完成时区的管理。

本文根据官方文档整理和总结而成,更为详细的内容请参考MySQL的官方文档:
MySQL 8.0参考手册 / DATE,DATETIME和TIMESTAMP类型
MySQL 8.0参考手册 / TIMESTAMP和DATETIME的自动初始化和更新

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新 的相关文章

随机推荐

  • 使用简单的IO函数实现文件拷贝功能

    需求 xff1a 用fgetc和fputc实现一个文件的拷贝 xff0c 例如将a c中的内容拷贝到b c中 拷贝完毕后 可以用diff指令判断 两个文件是否相同 xff1a diff a c b c 代码实现过程 xff1a includ
  • 电子词典流程图

  • 22-03-08

    分析vmlinux可执行文件是如何生成的 已知该vmlinux与compressed路径下的vmlinux不是同一个 xff0c 是位于内核源码顶层目录下的vmlinux xff0c 并且这个vmlinux是make的一部分 xff0c 因
  • 利用GPIO子系统实现LED1~3点亮

    需求 xff1a 利用GPIO子系统与定时器实现LED1 3每隔1s翻转一次 实现过程 xff1a 1 利用GPIO子系统实现驱动LED硬件工作 xff0c 需要利用核心层提供的API接口函数 2 gpio控制器结点已经在设备树文件中编写好
  • 编写驱动,应用层程序,在应用层通过ioctl控制LED灯流水,当按键KEY1按下,让风扇转动

    需求 xff1a 编写驱动 xff0c 应用层程序 xff0c 在应用层通过ioctl控制LED灯流水 xff0c 当按键KEY1按下 xff0c 让风扇转动 实现过程 xff1a 在源码目录下arch arm boot dts stm32
  • 使用platform框架实现led流水灯和按键中断开启风扇

    需求 xff1a 使用platform框架实现led流水灯和按键中断开启风扇 实现过程 xff1a 设备树文件 xff1a dts v1 include 34 stm32mp157 dtsi 34 include 34 stm32mp15x
  • Centos7安装Redis

    今天和大家分享如何在Centos7上部署Redis数据库 xff0c 感兴趣的小伙伴可收藏 目录 一 准备工作 二 搭建服务器 三 部署Redis 3 1 远程登录我们的服务器 3 2 配置Redis 3 3 测试Redis 3 4 服务器
  • 详细介绍云服务器购买并使用

    由于原先的服务器块过期了 xff0c 所以今天和大家分享一下如何从头开始购买云服务器并使用 目录 一 详细步骤 1 选择服务器 xff1a 2 购买服务器 xff1a 3 配置服务器操作系统 4 进入控制台 5 管理服务器 6 登录系统实例
  • SDN初学者之路

    今天重新开始拿起SDN完成我的关于SDN控制器下关于交换机迁移的负载均衡问题研究 以此对于SDN 43 RYU 43 多控制器 43 交换机迁移 43 负载均衡相关进行整理记录 其中 xff0c 主要研究内容是交换机迁移过程中的路径最优化选
  • 腾讯云短信服务(详细教程-Django框架、API接口)实现

    今天和大家分享如何实现短信服务 xff0c 以腾讯云服务为例 目录 一 准备工作 二 短信服务接口开发 2 1 服务配置 2 2接口开发 三 测试短信服务 四 结束语 一 准备工作 腾讯云短信服务会发放免费的个人认证短信和赠送短信总共200
  • Pytest测试框架基础篇

    今天和大家分享一下pytest测试框架的基础篇 xff0c 内容包括 xff1a 了解pytest测试框架的特点 掌握pytest基本使用 掌握pytest常用的场景 掌握pytest运行参数和配置方法 目录 一 测试框架的作用和类型 1
  • Pytest测试框架进阶篇

    今天和大家分享pytest测试框架进阶篇 xff0c 也可以称之为pytest测试框架核心 xff0c 主要核心有 xff1a 掌握pytest fixture 掌握pytest mark 目录 一 掌握pytest fixture 1 1
  • PowerDesigner--快速创建表模型生成SQL语句

    今天和大家分享一个我常用的设计表模型的工具PowserDesigner 选择物理模型 创建表 字段 索引等 梳理表之间的关系 一键生成SQL语句 目录 一 准备工作 二 选择物理模型 三 创建表 字段等 3 1 创建表 3 2 创建字段 3
  • python读取txt文件内容并进行分析

    今天和大家分享一下python如何读取txt文件内容并进行数据分析的 需求 某txt文件中存在很多数据 这些数据的某一个属性主要分为A B C D四类 xff0c 要求把数据分成四类求某一数值属性的平均值 xff0c 并统计生成超过平均值两
  • python脚本控制服务器---paramiko的使用

    今天和大家分享一个第三方库paramiko xff0c 主要应用场景是在实现自动化操作服务器时使用 xff0c 模拟我们手动登录服务器 输入cmd命令等操作 最后封装成自己的工具 xff0c 方便后面调用 目录 一 安装paramiko 二
  • Vim编辑器常用快捷方式

    这几天在学习shell编程 xff0c 其中常常会用到Linux下的vim编译器 xff0c 今天就总结一些在vim编辑器中常用的快捷键 xff0c 方便我们更好的使用 目录 一 vi编辑器基本概念 二 模式切换 三 编辑模式 四 命令行模
  • Linux面试相关知识点看着一文就够了

    今天和大家分享一下linux操作系统下主要用到的几个知识点 xff0c 分别是 xff1a linux目录结构 linux常用命令 文件权限操作 服务操作 yum安装命令 docker服务 vim编译器 pymysql测试连接 用户及组命令
  • Python对象比较及深浅拷贝

    今天和大家分享一个python语言中特别重要的一个知识点 xff0c 比较及拷贝 目录 一 61 61 和 is 二 深浅拷贝 2 1 浅拷贝 2 2 深拷贝 三 总结 一 61 61 和 is 等于 61 61 和is是Python中对象
  • python中的值传递和引用传递

    今天和大家分享python中很重要的一个知识点 xff1a 参数传递 xff0c 其中包括值传递和引用传递 目录 一 为什么要熟悉值传递和引用传递 1 1 值传递 1 2 引用传递 二 Python变量及其赋值 三 Python函数的参数传
  • MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

    MySQL8 0下DATE DATETIME和TIMESTAMP的自动初始化和更新 DATE日期类型DATETIME和TIMESTAMP的不同什么是时区自动变动 xff1f DATETIME和TIMESTAMP的相同点微秒小数部分自动初始化