[datetime]、 [timestamp]有什么区别 该如何选择

区别

  • 占用空间
类型 占据字节
datetime 8 字节
timestamp 4 字节
  • 表示范围
类型 表示范围
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 直接相减就行。

  • 时区

timestamp 只占 4 个字节,而且是以utc的格式储存, 它会自动检索当前时区并进行转换

datetime以 8 个字节储存,不会进行时区的检索

也就是说,对于timestamp来说,如果储存时的时区和检索时的时区不一样,那么拿出来的数据也不一样。对于datetime来说,存什么拿到的就是什么

  • 存NULL

如果存进去的是NULL,timestamp会自动储存当前时间,而 datetime会储存 NULL

选择

如果在时间上要超过Linux时间的,或者服务器时区不一样的就建议选择 datetime

如果是想要使用自动插入时间或者自动更新时间功能的,可以使用timestamp

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

MySQL 5.6.4 以后,占据字节从 8 降到了 5。

如果存进去的是 NULL,timestamp 会自动储存当前时间,而 datetime 会储存 NULL

实测,如果 timestamp 设置为 NULL ,也将存储 NULL ,如果如果设置 ON UPDATE 时,不操作时才会正确更新。

CREATE TABLE IF NOT EXISTS `t1`
(
    `t1` timestamp NULL,
    `t2` timestamp NULL default now() ON UPDATE now(),
    `t3` varchar(100)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci;

select *
from t1;

truncate t1;

insert into t1
values (null, null, rand());

select *
from t1;

update t1
set t1 = null,
    # 如果去掉这一行的注释, t1 才会自动更新。
    #t2 = null,
    t3 = rand();

select *
from t1;
1年前 评论
隐德莱希 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!