1. 程式人生 > >MySQL 基礎--時間戳類型

MySQL 基礎--時間戳類型

數據 數據轉換 for mysq one 指定 入行 異常 類型

時間戳數據存儲

1、TimeStamp的取值範圍為1970-01-01 00:00:01 UTC 至2038-01-19 03:14:07 UTC;
2、在存儲時間戳數據時先將數據轉換為UTC時區,然後計算起毫秒值,再存放到表中;
3、在讀取時間戳數據時先將數據轉換為UTC時區,然後轉換為本地時區顯示給用戶;
4、時間戳類型使用4個字節來存放數據。

時間戳字段定義

1、時間戳字段包含DEFAULT CURRENT_TIMESTAMP, 表示插入記錄行時,如果未對該列指定值,則使用當前時間來為該字段賦值。
2、時間戳字段包含ON UPDATE CURRENT_TIMESTAMP, 表示在更新記錄時,如果為更新該事件戳列,使用當前時間來更新該字段。
3、當字段定義為timestamp DEFAULT CURRENT_TIMESTAMP,表示該字段僅在插入且未指定值時被賦予當前時間,再更新時且未指定值時不做修改。 4、當字段定義為timestamp ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入且未指定值時被賦值為"0000-00-00 00:00:00",在更新且未指定值時更新為當前時間。 5、當字段定義為timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示該字段在插入或更新時未指定值,則被賦值為當前時間。 6、時間戳字段在MySQL 5.5和MySQL 57中隱式
默認值為NOT NULL,在MySQL 5.6中隱式默認值為NULL。
7、在MySQL中,時間戳字段可以被顯式插入或更新。 8、在MySQL中可以定義多個時間戳列。

參數對時間戳的影響

當參數explicit_defaults_for_timestamp設置為1時:
1、TIMESTAMP列如果沒有明確指定為NOT NLL則默認為NULL
2、表中第一個TIMESTAMP列不會自動分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性,需要顯式聲明。
3、表中TIMESTAMP列聲明為NOT NULL時,不會自動創建默認值

當參數explicit_defaults_for_timestamp設置為0時:
1、TIMESTAMP列如果沒有明確指定為NLL,則默認為NOT NULL 2、如果TIMESTAMP列明確指定為NULL,則會增加默認值NULL 3、表中的第一個TIMESTAMP列,如果沒有聲明NULL屬性、DEFAULT或者 ON UPDATE,會自動分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性。 4、表中第二個TIMESTAMP列,如果沒有聲明為NULL或者DEFAULT子句,會定義為DEFAULT ’0000-00-00 00:00:00′。插入行時沒有指明改列的值,該列默認為’0000-00-00 00:00:00′,不會產生警告。 TIMESTAMP列的默認屬性嚴重依賴於參數explicit_defaults_for_timestamp設置,因此建議在創建時顯示聲明TIMESTAMP列的各項屬性,避免因參數設置不同而導致邏輯問題!

時間戳字段在MySQL各版本的差異

時間戳字段在MySQL各版本的差異
1、在MySQL 5.5及之前版本中,僅能對一個時間戳字段定義DEFUALT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP,但在MySQL 5.6和MySQL 5.7版本中取消了該限制。
2、在MySQL 5.6版本中參數explicit_defaults_for_timestamp默認值為1;
3、在MySQL 5.7版本中參數explicit_defaults_for_timestamp默認值為0;

4、當定於c1 timestamp 時,
    在MySQL 5.5中等價於`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
    在MySQL 5.6中等價於`c1` timestamp NULL DEFAULT NULL;
    在MySQL 5.7中等價於`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

5、當定於c1 timestamp default 0時,
    在MySQL 5.5中等價於`c1` timestamp NOT NULL DEFAULT 0000-00-00 00:00:00;
    在MySQL 5.6中等價於`c1` timestamp NULL DEFAULT 0000-00-00 00:00:00;
    在MySQL 5.7中等價於`c1` timestamp NOT NULL DEFAULT 0000-00-00 00:00:00;

時間戳建議

1、在只關心數據最後更新時間的情況下,建議將時間戳列定義為TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
2、在關心創建時間和更新時間的情況下,將創建時間定義為DAETIME或 TIMESTAMP DEFAULT 0000-00-00 00:00:00,並在插入記錄時顯式指定創建時間;
3、建議在表中只定義單個時間戳列,請顯式定義DEFAULT 和 ON UPDATE屬性;
4、建議僅在必要的情況下對時間戳列進行顯式插入和更新
5、當time_zone=system的時候,查詢timestamp字段,會調用系統的時區值做時區轉換,在高並發或大數據量下,可能會觸發CPU異常暴漲。

MySQL 基礎--時間戳類型