注釋:在舊版本的MySQL中(4.1之前),TIMESTAMP列類型的屬性在許多方面于本節所描述的大大不同。如果你需要對舊的TIMESTAMP數據進行轉化以便在MySQL 5.1中工作,詳情請參見MySQL 4.1 參考手冊。
TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。
MySQL服務器也可以以MAXDB模式運行。當服務器以該模式運行時,TIMESTAMP與DATETIME相等。也就是說,如果創建表時服務器以MAXDB模式運行,TIMESTAMP列創建為DATETIME列。結果是,該列使用DATETIME顯示格式,有相同的值范圍,并且沒有自動對當前的日期和時間進行初始化或更新。
要想啟用MAXDB模式,在啟動服務器時使用--sql-mode=MAXDB服務器選項或在運行時通過設置全局sql_mode變量將SQL服務器模式設置為MAXDB:
mysql> SET GLOBAL sql_mode=MAXDB;
客戶端可以按照下面方法讓服務器為它的連接以MAXDB模式運行:
mysql> SET SESSION sql_mode=MAXDB;
MySQL不接受在日或月列包括一個零或包含非法日期值的時間戳值。該規則的唯一例外是特殊值'0000-00-00 00:00:00'。
你可以非常靈便地確定什么時候初始化和更新TIMESTAMP和對哪些列進行初始化和更新:
· 你可以將當前的時間戳指定為默認值和自動更新的值。但只能選擇一個,或者兩者都不選。(不可能一個列選擇一個行為而另一個列選擇另一個行為)。
· 你可以指定哪個TIMESTAMP列自動初始化或更新為當前的日期和時間。不再需要為第1個TIMESTAMP列。
請注意下面討論所信息只適用于創建時未啟用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列創建為DATETIME列)。控制TIMESTAMP列的初始化和更新的規則如下所示:
· 如果一個表內的第1個TIMESTAMP列指定為一個DEFAULT值,則不能忽略。 默認值可以為CURRENT_TIMESTAMP或常量日期和時間值。
· DEFAULT NULL與第1個TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。對于其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0。
· 表內的任何一個TIMESTAMP列可以設置為自動初始化為當前時間戳和/或更新。
· 在CREATE TABLE語句中,可以用下面的任何一種方式聲明第1個TIMESTAMP列:
o 用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列為默認值使用當前的時間戳,并且自動更新。
o 不使用DEFAULT或ON UPDATE子句,與DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP相同。
o 用DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列為默認值使用當前的時間戳但是不自動更新。
o 不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有默認值0并自動更新。
o 用常量DEFAULT值,列有給出的 默認值。如果列有一個ON UPDATE CURRENT_TIMESTAMP子句,它自動更新,否則不。
換句話說,你可以為初始值和自動更新的值使用當前的時間戳,或者其中一個使用,或者兩個皆不使用。(例如,你可以指定ON UPDATE來啟用自動更新而不讓列自動初始化)。
· 在DEFAULT和ON UPDATE子句中可以使用CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()或者NOW()。它們均具有相同的效果。
兩個屬性的順序并不重要。如果一個TIMESTAMP列同時指定了DEFAULT和ON UPDATE,任何一個可以在另一個的前面。
例子,下面這些語句是等效的:
CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
DEFAULT CURRENT_TIMESTAMP);
· 要為TIMESTAMP列而不是第1列指定自動默認或更新,必須通過將第1個TIMESTAMP列顯式分配一個常量DEFAULT值來禁用自動初始化和更新。(例如,DEFAULT 0或DEFAULT'2003-01-01 00:00:00')。然后,對于其它TIMESTAMP列,規則與第1個TIMESTAMP列相同,例外情況是不能忽略DEFAULT和ON UPDATE子句。如果這樣做,則不會自動進行初始化或更新。
例如:下面這些語句是等效的:
CREATE TABLE t (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
DEFAULT CURRENT_TIMESTAMP);
可以對每個連接設置當前的時區,相關描述參見5.10.8節,“MySQL服務器時區支持”。TIMESTAMP值以UTC格式保存,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。只要時區設定值為常量,便可以得到保存時的值。如果保存一個TIMESTAMP值,應更改時區然后檢索該值,它與你保存的值不同。這是因為在兩個方向的轉換中沒有使用相同的時區。當前的時區可以用作time_zone系統變量的值。
可以在TIMESTAMP列的定義中包括NULL屬性以允許列包含NULL值。例如:
CREATE TABLE t
(
ts1 TIMESTAMP NULL DEFAULT NULL,
ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);
如果未指定NULL屬性,將列設置為NULL設置則會將它設置為當前的時間戳。請注意允許NULL值的TIMESTAMP列不會采用當前的時間戳,除非要么其 默認值定義為CURRENT_TIMESTAMP,或者NOW()或CURRENT_TIMESTAMP被插入到該列內。換句話說,只有使用如下定義創建,定義為 NULL的TIMESTAMP列才會自動更新:
CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP);
否則-也就是說,如果使用NULL而不是DEFAULT TIMESTAMP來定義TIMESTAMP列,如下所示...
CREATE TABLE t1 (ts NULL DEFAULT NULL);
CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');
...則必須顯式插入一個對應當前日期和時間的值。例如:
INSERT INTO t1 VALUES (NOW());
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);