mysql中DATETIME、DATE和TIMESTAMP的區別 DATETIME、DATE和 TIMESTAMP類型是相似的。本篇描述了它們的特性以及它們的相似點與不同點。 DATETIME類型可用於需要同時包含日期和時間信息的值。MySQL 以 'YYYY-MM-DD HH:MM:SS'格式檢索與顯示 DATETIME 類型。支持的范圍是'1000-01-0100:00:00' 到 '9999-12-3123:59:59'。(“支持”的含義是,盡管更早的值可能工作,但不能保證他們均可以。) DATE類型可用於需要一個日期值而不需要時間部分時。MySQL 以 'YYYY-MM-DD' 格式檢索與顯示DATE值。支持的范圍是 '1000-01-01' 到'9999-12-31'。 TIMESTAMP列類型提供了一種類型,通過它你可以以當前操作的日期和時間自動地標記 Insert 或Update 操作。如果一張表中有多個TIMESTAMP列,只有第一個被自動更新。 “完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的顯示尺寸創造 最常見的顯示尺寸是6、8、12、和14。 你可以在創建表時指定一個任意的顯示尺寸,但是定義列長為0或比14大均會被強制定義為列長14。 列長在從1~13范圍的奇數值尺寸均被強制為下一個更大的偶數。 列如: 定義字段長度 強制字段長度 TIMESTAMP(0) -> TIMESTAMP(14) TIMESTAMP(15)-> TIMESTAMP(14) TIMESTAMP(1) -> TIMESTAMP(2) TIMESTAMP(5) -> TIMESTAMP(6) 所有的TIMESTAMP列都有同樣的存儲大小, 使用被指定的時期時間值的完整精度(14位)存儲合法的值不考慮顯示尺寸。 不合法的日期,將會被強制為0存儲 自動更新第一個 TIMESTAMP列在下列任何條件下發生: 列值沒有明確地在一個 Insert 或LOAD DATAINFILE 語句中被指定。 列值沒有明確地在一個 Update語句中被指定,並且其它的一些列值已發生改變。(注意,當一個 Update 設置一個列值為它原有值時,這將不會引起TIMESTAMP列的更新,因為,如果你設置一個列值為它當前值時,MySQL 為了效率為忽略更新。) 明確地以 NULL 設置 TIMESTAMP 列。 第一個列以外其它 TIMESTAMP列,可以設置到當前的日期和時間,只要將該列賦值 NULL 或 NOW()。 任何 TIMESTAMP列均可以被設置一個不同於當前操作日期與時間的值,這通過為該列明確指定一個你所期望的值來實現。這也適用於第一個TIMESTAMP列。這個選擇性是很有用的,舉例來說,當你希望 TIMESTAMP列保存該記錄行被新添加時的當前的日期和時間,但該值不再發生改變,無論以後是否對該記錄行進行過更新: 當該記錄行被建立時,讓 MySQL設置該列值。這將初始化該列為當前日期和時間。 以後當你對該記錄行的其它列執行更新時,為TIMESTAMP列值明確地指定為它原來的值。 另一方面,你可能發現更容易的方法,使用DATETIME列,當新建記錄行時以 NOW()初始化該列,以後在對該記錄行進行更新時不再處理它。 示例(譯者注):
mysql> Create TABLE `tA` ( -> `id` int(3) unsigned NOT NULL auto_increment, -> `date1` timestamp(14) NOT NULL, -> `date2` timestamp(14) NOT NULL, -> PRIMARY KEY (`id`) -> ) TYPE=MyISAM; Query OK, 0 rows affected (0.01 sec) mysql> Insert INTO `tA` SET `id` = 1; Query OK, 1 row affected (0.02 sec) # 沒有明確地指定第一個 timestamp 列值,該列值被設為插入的當前時刻 # 沒有明確地指定其它的 timestamp 列值,MySQL 則認為插入的是一個非法值,而該列值被設為0 mysql> Insert INTO `tA` S (2, NOW(), NULL); Query OK, 1 row affected (0.01 sec) mysql> Select * FROM `tA`; +----+----------------+----------------+ | id | date1 | date2 | +----+----------------+----------------+ | 1 | 20030503104118 | 00000000000000 | | 2 | 20030503104254 | 20030503104254 | +----+----------------+----------------+ 2 rows in set (0.00 sec) mysql> Update `tA` SET `id` = 3 Where `id` = 1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 # 對某一記錄行進行了更新,第一個 timestamp 列值也將被更新 mysql> Update `tA` SET `id` = 2 Where `id` = 2; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0 # MySQL 忽略了這次操作,第一個 timestamp 列值不會被更新 mysql> Select * FROM `tA`; +----+----------------+----------------+ | id | date1 | date2 | +----+----------------+----------------+ | 3 | 20030503104538 | 00000000000000 | | 2 | 20030503104254 | 20030503104254 | +----+----------------+----------------+ 2 rows in set (0.00 sec) mysql> Update `tA` SET `id` = 1,`date1`=`date1` Where `id` = 3; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 # 明確地指定了第一個 timestamp 列值為它原有值,該值將不會被更新 mysql> Select * FROM `tA`; +----+----------------+----------------+ | id | date1 | date2 | +----+----------------+----------------+ | 1 | 20030503104538 | 00000000000000 | | 2 | 20030503104254 | 20030503104254 | +----+----------------+----------------+ 2 rows in set (0.00 sec) * 以上結果在 MySQL 4.0.12 中測試