MySQL 基础--时间戳类型

时间戳数据存储

1、TimeStamp的取值范围为'1970-01-01 00:00:01' UTC 至'2038-01-19 03:14:07' UTC;
2、在存储时间戳数据时先将数据转换为UTC时区,然后计算起毫秒值,再存放到表中;
3、在读取时间戳数据时先将数据转换为UTC时区,然后转换为本地时区显示给用户;
4、时间戳类型使用4个字节来存放数据。

 

 

时间戳字段定义

1、时间戳字段包含DEFAULT CURRENT_TIMESTAMP, 表示插入记录行时,如果未对该列指定值,则使用当前时间来为该字段赋值。
2、时间戳字段包含ON UPDATE CURRENT_TIMESTAMP, 表示在更新记录时,如果为更新该事件戳列,使用当前时间来更新该字段。
3、当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP,表示该字段仅在插入且未指定值时被赋予当前时间,再更新时且未指定值时不做修改。
4、当字段定义为timestamp ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入且未指定值时被赋值为"0000-00-00 00:00:00",在更新且未指定值时更新为当前时间。
5、当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入或更新时未指定值,则被赋值为当前时间。
6、时间戳字段在MySQL 5.5和MySQL 57中隐式默认值为NOT NULL,在MySQL 5.6中隐式默认值为NULL。
7、在MySQL中,时间戳字段可以被显式插入或更新。
8、在MySQL中可以定义多个时间戳列。

 

 

参数对时间戳的影响

复制代码
当参数explicit_defaults_for_timestamp设置为1时:
1、TIMESTAMP列如果没有明确指定为NOT NLL则默认为NULL
2、表中第一个TIMESTAMP列不会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性,需要显式声明。
3、表中TIMESTAMP列声明为NOT NULL时,不会自动创建默认值

当参数explicit_defaults_for_timestamp设置为0时:
1、TIMESTAMP列如果没有明确指定为NLL,则默认为NOT NULL
2、如果TIMESTAMP列明确指定为NULL,则会增加默认值NULL
3、表中的第一个TIMESTAMP列,如果没有声明NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
4、表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,会定义为DEFAULT ’0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认为’0000-00-00 00:00:00′,不会产生警告。

TIMESTAMP列的默认属性严重依赖于参数explicit_defaults_for_timestamp设置,因此建议在创建时显示声明TIMESTAMP列的各项属性,避免因参数设置不同而导致逻辑问题!
复制代码

 

 

时间戳字段在MySQL各版本的差异

复制代码
时间戳字段在MySQL各版本的差异
1、在MySQL 5.5及之前版本中,仅能对一个时间戳字段定义DEFUALT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,但在MySQL 5.6和MySQL 5.7版本中取消了该限制。
2、在MySQL 5.6版本中参数explicit_defaults_for_timestamp默认值为1;
3、在MySQL 5.7版本中参数explicit_defaults_for_timestamp默认值为0;

4、当定于c1 timestamp 时,
    在MySQL 5.5中等价于`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
    在MySQL 5.6中等价于`c1` timestamp NULL DEFAULT NULL;
    在MySQL 5.7中等价于`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

5、当定于c1 timestamp default 0时,
    在MySQL 5.5中等价于`c1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
    在MySQL 5.6中等价于`c1` timestamp NULL DEFAULT '0000-00-00 00:00:00';
    在MySQL 5.7中等价于`c1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00';
复制代码

 

时间戳建议

1、在只关心数据最后更新时间的情况下,建议将时间戳列定义为TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
2、在关心创建时间和更新时间的情况下,将创建时间定义为DAETIME或 TIMESTAMP DEFAULT '0000-00-00 00:00:00',并在插入记录时显式指定创建时间;
3、建议在表中只定义单个时间戳列,请显式定义DEFAULT 和 ON UPDATE属性;
4、建议仅在必要的情况下对时间戳列进行显式插入和更新
5、当time_zone=system的时候,查询timestamp字段,会调用系统的时区值做时区转换,在高并发或大数据量下,可能会触发CPU异常暴涨。

 

posted on   笑东风  阅读(1496)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

点击右上角即可分享
微信分享提示