top
Loading...
11.3.1.1.自MySQL4.1以來的TIMESTAMP屬性
11.3.1.1. 自MySQL 4.1以來的TIMESTAMP屬性

注釋:舊版本的MySQL(4.1之前)TIMESTAMP列類型的屬性在許多方面于本節所描述的大大不同。如果你需要對舊的TIMESTAMP數據進行轉化以便在MySQL 5.1中工作,詳情請參見MySQL 4.1 參考手冊

TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS

MySQL服務器也可以以MAXDB模式運行。當服務器以該模式運行時,TIMESTAMPDATETIME相等。也就是說,如果創建表時服務器以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列自動初始化或更新為當前的日期和時間。不再需要為第1TIMESTAMP列。

請注意下面討論所信息只適用于創建時未啟用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列創建為DATETIME列)控制TIMESTAMP列的初始化和更新的規則如下所示:

·         如果一個表內的第1TIMESTAMP列指定為一個DEFAULT值,則不能忽略。 默認值可以為CURRENT_TIMESTAMP或常量日期和時間值。

·         DEFAULT NULL與第1TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。對于其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0

·         表內的任何一個TIMESTAMP列可以設置為自動初始化為當前時間戳和/或更新。

·         CREATE TABLE語句中,可以用下面的任何一種方式聲明第1TIMESTAMP列:

o        DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP子句,列為默認值使用當前的時間戳,并且自動更新。

o        不使用DEFAULTON 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來啟用自動更新而不讓列自動初始化)

·         DEFAULTON UPDATE子句中可以使用CURRENT_TIMESTAMPCURRENT_TIMESTAMP()或者NOW()。它們均具有相同的效果。

兩個屬性的順序并不重要。如果一個TIMESTAMP列同時指定了DEFAULTON 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列指定自動默認或更新,必須通過將第1TIMESTAMP列顯式分配一個常量DEFAULT值來禁用自動初始化和更新。(例如,DEFAULT 0DEFAULT'2003-01-01 00:00:00')。然后,對于其它TIMESTAMP列,規則與第1TIMESTAMP列相同,例外情況是不能忽略DEFAULTON 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被插入到該列內。換句話說,只有使用如下定義創建,定義為 NULLTIMESTAMP列才會自動更新:

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);
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/column-types.html
北斗有巢氏 有巢氏北斗