MySQL 保存日期,用哪种数据类型合适?datetime?timestamp?还是 int?

如题所述

日期在开发中是常见的数据类型,大多数表中都会有创建时间和更新时间字段。MySQL提供了多种日期数据类型,包括:

等等。也有开发者直接将日期以字符串形式存储。

那么,应该使用哪种类型来存储日期呢?

1. 字符串

首先,应排除字符串类型。尽管新手开发者喜欢使用它,但这种方法并不理想。

使用字符串存储日期的第一个问题是无法使用MySQL的日期函数,这会为查询带来不便。

例如,如果用户表中有一个字段birthday表示用户生日,现在想要查询2001年出生的所有用户,如果birthday是日期类型,就可以使用YEAR函数,但如果birthday是字符串类型,这个问题就难以处理。

使用字符串存储日期的第二个问题是占用空间较大,例如存储如下时间:

2021-01-01 00:00:00

因此,首先排除字符串。

2. DATETIME VS TIMESTAMP

2.1 占用空间

DATETIME在数据库中的存储形式为:YYYY-MM-DD hh:mm:ss,占用的字节数视情况而定。以下为MySQL官网的内容:

可以看到,MySQL5.6.4是一个分水岭:

同样,从上图也可以看出,在MySQL5.6.4之前,TIMESTAMP固定占用4个字节,从MySQL5.6.4开始,根据毫秒的精度,TIMESTAMP占用的字节数介于4到7之间。

所以无论是TIMESTAMP还是DATETIME,都比字符串节省空间。

2.2 存储范围

DATETIME的存储范围介于1000-01-01 00:00:00到9999-12-31 23:59:59之间。

TIMESTAMP的存储范围则介于1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC之间。

很明显,DATETIME的存储范围更大。

2.3 底层存储

TIMESTAMP类型最大的优势在于自带时区属性,因为它本质上是从毫秒转化而来。如果你的业务需要对应不同的国家时区,那么类型TIMESTAMP是一种不错的选择。TIMESTAMP类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间。

例如,新闻类业务通常用户想知道这篇新闻发布时对应自己国家时间,TIMESTAMP是一种不错的选择。

2.4 性能比较

从毫秒数转换到TIMESTAMP并不费事,但是当需要进行时区转换时,需要调用操作系统底层系统函数,而这个函数需要额外的加锁操作,以确保这时操作系统时区没有修改,一加锁,效率就低了。

对于这个问题,只存在于TIMESTAMP中,因为DATETIME不存在时区转化问题。

对于TIMESTAMP,建议使用显式的时区,而不是操作系统时区。

3. int

字符串占用空间大,TIMESTAMP和DATETIME如果没有吃透则总感觉乱乱的,所以也有人存时间戳,存一个int类型的数值,用一个时间戳来表示时间。

用int保存时间的话,当我们需要进行日期排序以及按照日期范围查询的时候,就变成了普通的数字比较了,那么效率肯定是杠杠滴。

不过int有一个致命的问题就是可读性太差,所以用不用int就要仔细斟酌看情况了。
温馨提示:答案为网友推荐,仅供参考
相似回答