MySQL中datetime和timestamp的区别
相同点
- 两个数据类型存储时间的格式一致。均为
YYYY-MM-DD HH:MM:SS
- 两个数据类型都包含「日期」和「时间」部分。
- 两个数据类型都可以存储微秒的小数秒(秒后6位小数秒)
自动更新和默认值
- TIMESTAMP :
- 支持默认值为当前时间,且在记录更新时可以自动更新为当前时间。
- 例如,
DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
。
- DATETIME :
- 从MySQL 5.6.5开始,支持
DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
。 - 在此之前不支持自动设置当前时间。
- 从MySQL 5.6.5开始,支持
区别
1. 占用空间
TIMESTAMP
:占 4 个字节(小数秒+3 个字节)DATETIME
:在 MySQL 5.6.4 之前,占 8 个字节 ,之后版本,占 5 个字节。(小数秒+3 个字节)
类型 | 占据字节 | 表示形式 |
---|---|---|
timestamp | 4 字节 | yyyy-mm-dd hh:mm:ss |
datetime | 8(5) 字节 | yyyy-mm-dd hh:mm:ss |
2. 表示范围
类型 | 表示范围 |
---|---|
datetime | '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999' |
timestamp | '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999' |
timestamp
翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数。对于某些时间的计算,如果是以 datetime
的形式会比较困难,假如我是 1994-1-20 06:06:06
出生,现在的时间是 2016-10-1 20:04:50
,那么要计算我活了多少秒钟用 datetime
还需要函数进行转换,但是 timestamp
直接相减就行。
3. 时区(存入时间是否会自动转换?)
timestamp
只占 4 个字节,而且是以utc
的格式储存, 它会自动检索当前时区并进行转换。
datetime
以 8 个字节储存,不会进行时区的检索.
也就是说,对于timestamp
来说,如果储存时的时区和检索时的时区不一样,那么拿出来的数据也不一样。对于datetime
来说,存什么拿到的就是什么。
4.使用 now()
存储当前时间时,保存的实际值,是否与当前计算机时间一致?
TIMESTAMP
:可能不一致。存储值会被转换成 UTC 时间值再存入数据库。DATETIME
:与当前时间是一致的。
5.如果存入的是 NULL
时,两个类型如何存储?
TIMESTAMP
:会自动存储当前时间(now()
)。DATETIME
:不会自动存储当前时间,会直接存入NULL
值。
时间复杂度
- TIMESTAMP :
- 插入和检索时间复杂度为O(1),因为存储的是一个整数值(Unix时间戳)。
- 需要进行时区转换,可能会在某些操作上稍微增加时间。
- DATETIME :
- 插入和检索时间复杂度也为O(1),直接存储和检索"YYYY-MM-DD HH:MM"格式的字符串。
- 不涉及时区转换,因此在某些操作上可能更快。
选择
如果在时间上要超过Linux
时间的,或者服务器时区不一样的就建议选择 datetime
。
如果只是想表示年、日期、时间的还可以使用 year
、 date
、 time
,它们分别占据 1、3、3 字节,而datetime
就是它们的集合。
如果数据库中有timestamp类型的字段,mysql数据库不管是迁库,还是集群,都一定要保证时区的相同。如果mysql集群中的数据库时区不一致,timestamp的字段将会造成数据不一致的情况发生。 在迁移库或者搭建集群时一定检查时区,保证时区的相同
。中国时区默认是+8,所以不管是单节点mysql,还是mysql集群,我们第一件事就是应该将当前时区time_zone
设置为+8:00
。