[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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM