MySQL中datetime和timestamp的区别

MySQL中datetime和timestamp的区别

相同点

  1. 两个数据类型存储时间的格式一致。均为 YYYY-MM-DD HH:MM:SS
  2. 两个数据类型都包含「日期」和「时间」部分。
  3. 两个数据类型都可以存储微秒的小数秒(秒后6位小数秒)

自动更新和默认值

  • TIMESTAMP
    • 支持默认值为当前时间,且在记录更新时可以自动更新为当前时间。
    • 例如,DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP
  • DATETIME
    • 从MySQL 5.6.5开始,支持DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP
    • 在此之前不支持自动设置当前时间。

区别

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

如果只是想表示年、日期、时间的还可以使用 yeardatetime,它们分别占据 1、3、3 字节,而datetime就是它们的集合。

如果数据库中有timestamp类型的字段,mysql数据库不管是迁库,还是集群,都一定要保证时区的相同。如果mysql集群中的数据库时区不一致,timestamp的字段将会造成数据不一致的情况发生。 在迁移库或者搭建集群时一定检查时区,保证时区的相同。中国时区默认是+8,所以不管是单节点mysql,还是mysql集群,我们第一件事就是应该将当前时区time_zone设置为+8:00

参考文章

MySQL中datetime和timestamp的区别 - 掘金 (juejin.cn)