在 MySQL 資料庫中,處理日期與時間是常見需求。DATE、DATETIME 與 TIMESTAMP 三種類型雖然相關,但各有特性與適用場景。本文將詳細比較它們的儲存範圍、顯示格式、自動更新行為以及相互轉換時的注意事項,幫助你選擇最適合的類型。
| 類型 | 用途 | 顯示格式 | 支援範圍 | 儲存大小 |
|---|---|---|---|---|
| DATE | 僅需日期,無時間部分 | YYYY-MM-DD | 1000-01-01 至 9999-12-31 | 3 位元組 |
| DATETIME | 同時需要日期與時間 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | 8 位元組 |
| TIMESTAMP | 自動記錄建立/更新時間 | 視顯示寬度而定(如 YYYYMMDDHHMMSS) | 1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC | 4 位元組 |
適用於需要完整時間戳記的場景。MySQL 以 YYYY-MM-DD HH:MM:SS 格式檢索並顯示。範圍極廣,適合歷史資料或未來長遠規劃。
僅儲存日期,忽略時間。顯示格式為 YYYY-MM-DD。若只關心年月日(如生日、入職日),使用 DATE 可節省空間。
TIMESTAMP 最大特色是可自動標記 INSERT 或 UPDATE 操作的當前日期時間。預設只有第一個 TIMESTAMP 欄位具備自動更新特性,觸發條件包括:
其他 TIMESTAMP 欄位若需自動更新,需在 INSERT/UPDATE 時明確設為 NULL 或 NOW()。
TIMESTAMP 可指定顯示寬度(如 TIMESTAMP(14)、TIMESTAMP(8)),但實際儲存永遠是 14 位元完整精度。寬度只影響顯示,不影響儲存。若使用 ALTER TABLE 擴大寬度,先前「隱藏」的時分秒將重現;縮小寬度則不會遺失資料,僅顯示較少資訊。
TIMESTAMP 範圍限於 1970 年至 2038 年(32 位元有號整數上限)。超出此範圍的日期(如 1968-01-01)若存入 TIMESTAMP 會變成「零值」(00000000000000)。DATETIME 與 DATE 則無此限制。
MySQL 接受多種字串與數字格式,具有「寬鬆」語法:
'YYYY-MM-DD HH:MM:SS'、'YY-MM-DD HH:MM:SS',分隔符可為任意標點(如 .、/、@、^)。'YYYYMMDDHHMMSS'、'YYMMDDHHMMSS',長度決定解析方式(8/14 字元視為 4 位年,6/12 字元視為 2 位年)。YYYYMMDDHHMMSS、YYMMDDHHMMSS 等,同樣依長度判斷。NOW()、CURRENT_DATE 等。非法值會轉換為對應類型的「零值」('0000-00-00 00:00:00'、'0000-00-00' 或 00000000000000)。
00:00:00。'10:11:12' 會被解析為 2010-11-12(視為年月日),而非時間。'10:45:15' 則因月份 45 不合法而變零值。UNIX_TIMESTAMP();HOUR()、SECOND() 等函數需顯示寬度包含對應部分才能正確運作。DATETIMEDATETIMESTAMP(首欄自動更新)理解三者差異、範圍限制與自動更新行為,能避免資料截斷、零值錯誤及時區困擾。實務上,若應用涉及歷史資料或超出 2038 年,優先選 DATETIME;單純記錄建立/更新時間且確定在範圍內,TIMESTAMP 更便利;僅需日期則用 DATE 節省空間。