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