建表语句如下:
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。