存储如下时间:
2021-01-01 00:00:00
如果使用字符串,需要 19 个字节。
如果使用 datetime 需要 8 个字节。
如果使用 timestamp 需要 4 个字节。
所以首先排除掉字符串。
DATETIME
- 在数据库中存储的形式为:YYYY-MM-DD hh:mm:ss
- 存储范围介于 1000-01-01 00:00:00 到 9999-12-31 23:59:59 之间。
- 没有时区信息的(时区无关)
MySQL5.6.4 是一个分水岭:
- 在 MySQL5.6.4 之前,DATETIME 固定占用 8 个字节。
- 从 MySQL5.6.4 开始,DATETIME 类型开始支持毫秒,DATETIME(N) 中的 N 表示毫秒的精度。
TIMESTAMP
- 储范围则介于 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC 之间。
- 和时区有关,因为它本质上是从毫秒转化而来。会随着服务器时区的变化而变化,自动换算成相应的时间。
举个 TIMESTAMP 的使用场景例子:
新闻类的业务,通常用户想知道这篇新闻发布时对应的自己国家时间,那么 TIMESTAMP 是一种不错的选择。
TIMESTAMP 会随着时区的变化而自动调整,而 DATETIME 不会。
从毫秒数转换到 TIMESTAMP 并不费事,但是当要进行时区转换的时候,需要调用操作系统底层系统函数,而这个函数需要额外的加锁操作,以确保这时操作系统时区没有修改,一加锁,效率就低了。
对于这个问题,只存在于 TIMESTAMP 中,因为 DATETIME 不存在时区转化问题。
对于 TIMESTAMP,建议使用显式的时区,而不是操作系统时区。
INT
用 int 保存时间的话,当我们需要进行日期排序以及按照日期范围查询的时候,就变成了普通的数字比较了,那么效率肯定是杠杠滴。
不过 int 有一个致命的问题就是可读性太差。