[MySQL] timestamp和datetime的区别

建表语句如下:

create table strong_passwd_whitelist(
  id int unsigned not null auto_increment,
  email_id int unsigned not null default 0,
  update_date timestamp,
  create_date datetime not null default current_timestamp,
  primary key(id),
  key index_email_id(email_id)
) engine=innodb charset=utf8;

 

1、  timestamp占用4个字节;

  datetime占用8个字节;


2、  timestamp范围1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999;

  datetime是1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999;

  注意:timestamp存储时在超过存储范围的时候会报错

  


3、  timestamp默认支持not null default CURRENT_TIMESTAMP自动更新当前时间;

  datetime 在5.6版本后才支持,需要手动指定not null default CURRENT_TIMESTAMP;

  


4、  timestamp转成utc(世界标准时间)存储,查询再自动转回来;

  datetime原样存储

 

timestamp为啥只到2038?

先看看mysql如何存储的:

对于timestamp,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。底层表示是时间戳。什么是时间戳?

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至某一时间点的总秒数。

例如北京时间2018-12-08 00:00:00的时间戳是1544198400,就是指从北京时间1970-01-01 08:00:00到2018-12-08 00:00:00已经过去了1544198400秒。

MySQL的timestamp类型是4个字节,最大值是2的31次方减1,也就是2147483647,转换成北京时间就是2038-01-19 11:14:07

 

要想大于这个时间,就用datetime   

datetime是常量,而timestamp受time_zone设置的影响,只有当将来可能 - 跨时区同步集群时,这才有意义。timestamp一般用于跟踪记录被更新的时间或创建时间.

基于项目考虑,以上因素不会影响到业务,所以果断换成datetime。

 

posted @ 2019-03-30 16:39  七彩鱼丸  阅读(9196)  评论(0编辑  收藏  举报