MySQL 数据库如何存储时间?Datetime 和 Timestamp 之间的抉择

1.切记不要用字符串存储日期

我记得我在大学的时候就这样干过,而且现在很多对数据库不太了解的新手也会这样干,可见,这种存储日期的方式的优点还是有的,就是简单直白,容易上手。

但是,这是不正确的做法,主要会有下面两个问题:

i. 字符串占用的空间更大!

ii. 字符串存储的日期比较效率比较低(逐个字符进行比对),无法用日期相关的 API 进行计算和比较。


2.Datetime 和 Timestamp 之间抉择

Datetime 和 Timestamp 是 MySQL 提供的两种比较相似的保存时间的数据类型。他们两者究竟该如何选择呢?

通常我们都会首选 Timestamp。 下面说一下为什么这样做!


2.1 DateTime 类型没有时区信息的

DateTime 类型是没有时区信息的(时区无关) ,DateTime 类型保存的时间都是当前会话所设置的时区对应的时间。这样就会有什么问题呢?当你的时区更换之后,比如你的服务器更换地址或者更换客户端连接时区设置的话,就会导致你从数据库中读出的时间错误。不要小看这个问题,很多系统就是因为这个问题闹出了很多笑话。

Timestamp 和时区有关。Timestamp 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,说简单点就是在不同时区,查询到同一个条记录此字段的值会不一样。TIMESTAMP 和 INT(无符号)最多只支持到 2038 年。换句话说,到了 2038 年,我们可能会遇到像 千年虫 那样的问题。


2.2 DateTime 类型耗费空间更大

Timestamp 只需要使用 4 个字节的存储空间,但是 DateTime 需要耗费 8 个字节的存储空间。但是,这样同样造成了一个问题,Timestamp 表示的时间范围更小。

DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

Timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59


《高性能 MySQL 》的作者推荐 Timestamp

2.3 到底选择什么

已有项目,遵循之前的时间类型。新项目看上去一切都指向应该使用时间戳类型,但是 TIMESTAMP 和 INT(无符号)最多只支持到 2038 年,面对这个问题,还是直接选择 DATETIME。


参考:

https://blog.csdn.net/qq_34337272/article/details/103971240

https://www.zhihu.com/question/19634415/answer/1468812709


修改时间 2022-05-30

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
真诚赞赏,手留余香
赞赏
随机推荐
WordPress 常用接口
JavaScript 原生拖放
MySQL 删除逗号分隔字段中的某一个值
WordPress 设置菜单
Debian11 安装笔记1:编译安装Nginx、Naxsi 和 Njs
WordPress 文章排序
ReferenceError: __dirname is not defined in ES module scope
Node.js 实现 RBAC 权限模型