MySQL 时间类型的选择


Posted in MySQL onJune 05, 2021

MySQL 提供了 DATETIME 和 TIMESTAMP 两种非常相似的类型处理日期和时间,大部分情况下两种都是 OK 的,但是有些情况二者会互有优劣。

DATETIME

DATETIME 的时间跨度更大,可以从1001年到9999年,精度是秒。并且存储的格式是将日期和时间打包使用 YYYYMMDDhhmmss格式的整数存储,这个时间与时区无关,需要占用8个字节的存储空间。默认,MySQL 显示 的DATETIME是有序的,明确的格式,例如2021-06-02 18:35:23。这是 ANSI 的标准日期时间格式。

TIMESTAMP

TIMESTAMP即时间戳,存储的是自格林威治时间(GMT)1970年1月1日零点以来的秒数。和 Unix 系统的时间戳一样。TIMESTAMP 仅需要4个字节存储,因此能够表示的时间跨度更小,从1970年到2038年。MySQL 提供了 FROM_UNIXTIME 和 UNIX_TIMESTAMP 函数来完成时间戳和日期之间的转换。

在 MySQL 4.1版本后,TIMESTAMP 显示的格式和 DATETIME 类似,但是,TIMESTAMP 的显示依赖于时区。MySQL 的服务端、操作系统以及客户端连接都有时区的设置。因此,如果时间是从多个时区存储的话,那 TIMESTAMP 和 DATETIME 的差别就会很大。TIMESTAMP 会保留使用时的时区信息,而 DATETIME 仅仅是使用文本表示时间。

TIMESTAMP 还有额外的特性。默认地,MySQL会在没有指定值的情况下使用当前时间插入到 TIMESTAMP列,而更新的时候如果没有指定值会使用当前时间更新该字段,以下面的测试表为例:

CREATE TABLE t_time_test (
    id INT PRIMARY KEY,
    t_stamp TIMESTAMP,
    t_datetime DATETIME
);

可以看到MySQL 给的默认值就是当前时间戳 CURRENT_TIMESTAMP,并且有个 ON UPDATE CURRENT_TIMESTAMP表示会随之更新:

MySQL 时间类型的选择

INSERT INTO t_time_test(id, t_datetime) VALUES
	(1, NULL), 
	(2, '2021-06-02 18:48:04'), 
	(3, NULL);

可以看到 t_stamp 列自动填充了当前时间。

MySQL 时间类型的选择

这个特性使得我们可以物协程序维护数据更新时间字段,而交由 MySQL 完成。

如何选择

从特性上看,可能会优先选择使用 TIMESTAMP 来存储时间,相比 DATETIME 来说更高效。也有些人使用整数存储 Unix 时间戳,实际上这种方式并不能获益,而且整数还需要额外进行处理,因此并不推荐这么做。但是一些情况需要注意不要使用 TIMESTAMP 存储时间:

  • 生日:生日肯定会有早于1970年的,会超出 TIMESTAMP 的范围
  • 有效期截止时间:TIMESTAMP 的最大时间是2038年,如果用来存类似身份证的有效期截止时间,营业执照的截止时间等就不合适。
  • 业务生存时间:互联网时代讲究快,发展(死得)快。如果要成为长久存在的企业,那么你的业务时间很可能在2038年还在继续运营,毕竟现在都2021年了。如果你觉得公司业务挺不到2038年,那没关系。当然,如果幸运地挺到2038年,请务必写下一条待办事项:到2038年1月1日前修改数据表时间戳字段类型。

如何存储毫秒级时间

通常这个时候需要使用 BIGINT 来将时间转换为整型存储,或者是使用浮点数,用分数部分表示秒精度一下的时间,这两种方式都可行。当然,这个时候需要应用支持做格式转换。

结语

从安全稳妥的角度考虑,建议还是优先选择 DATETIME 类型,虽然相比 TIMESTAMP 会牺牲一点性能,但是 TIMESTAMP 的时间范围是硬伤,不要埋下一个隐患,等到真的2038年,你的公司可能是上市公司的时候,程序员可能会遭遇洪水般的 bug 冲击而不明所以,结果公司的股价迎来闪崩!然后找出来这个程序员,发现是曾经公司的大神,目前的股东,已经实现财务自由的你!你说尴尬不尴尬?

以上就是MySQL 时间类型的选择的详细内容,更多关于MySQL 时间类型的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL表字段时间设置默认值
May 13 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
MySQL索引失效的典型案例
Jun 05 #MySQL
MySQL库表名大小写的选择
Jun 05 #MySQL
mysql 带多个条件的查询方式
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 #MySQL
Mysql中存储引擎的区别及比较
浅谈mysql返回Boolean类型的几种情况
Jun 04 #MySQL
Mysql 设置boolean类型的操作
Jun 04 #MySQL
You might like
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
python对数组进行反转的方法
2015/05/20 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
python列表返回重复数据的下标
2020/02/10 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
《最大的麦穗》教学反思
2014/04/17 职场文书
党员承诺书范文
2014/05/19 职场文书
广告宣传策划方案
2014/05/21 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
公司董事任命书
2015/09/21 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技