MySQL 中 datetime 和 timestamp 的區別與選擇

MySQL 中經常使用的兩種時間儲存類型分別是datetimetimestamp。如何在它們之間選擇是建表時必要的考慮。下面就談談他們的區別和怎麼選擇。服務器

1 區別

1.1 佔用空間

類型 佔據字節 表示形式
datetime 8 字節 yyyy-mm-dd hh:mm:ss
timestamp 4 字節 yyyy-mm-dd hh:mm:ss

1.2 表示範圍

類型 表示範圍
datetime '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
timestamp '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'

timestamp翻譯爲漢語即"時間戳",它是當前時間到 Unix元年(1970 年 1 月 1 日 0 時 0 分 0 秒)的秒數。對於某些時間的計算,若是是以 datetime 的形式會比較困難,假如我是 1994-1-20 06:06:06 出生,如今的時間是 2016-10-1 20:04:50 ,那麼要計算我活了多少秒鐘用 datetime 還須要函數進行轉換,可是 timestamp 直接相減就行。函數

1.3 時區

timestamp 只佔 4 個字節,並且是以utc的格式儲存, 它會自動檢索當前時區並進行轉換。測試

datetime以 8 個字節儲存,不會進行時區的檢索.spa

也就是說,對於timestamp來講,若是儲存時的時區和檢索時的時區不同,那麼拿出來的數據也不同。對於datetime來講,存什麼拿到的就是什麼。翻譯

還有一個區別就是若是存進去的是NULLtimestamp會自動儲存當前時間,而 datetime會儲存 NULLcode

2 測試

咱們新建一個表blog

image

插入數據rem

image

查看數據,能夠看到存進去的是NULLtimestamp會自動儲存當前時間,而 datetime會儲存NULLit

image

把時區修改成東 9 區,再查看數據,會會發現 timestampdatetime 多一小時table

image

若是插入的是無效的呢?假如插入的是時間戳

image

結果是0000-00-00 00:00:00,根據官方的解釋是插入的是無效的話會轉爲 0000-00-00 00:00:00,而時間戳並非MySQL有效的時間格式。

那麼什麼形式的能夠插入呢,下面列舉三種

//下面都是 MySQL 容許的形式,MySQL 會自動處理
2016-10-01 20:48:59
2016#10#01 20/48/59
20161001204859

3 選擇

若是在時間上要超過Linux時間的,或者服務器時區不同的就建議選擇 datetime

若是是想要使用自動插入時間或者自動更新時間功能的,能夠使用timestamp

若是隻是想表示年、日期、時間的還能夠使用 yeardatetime,它們分別佔據 一、三、3 字節,而datetime就是它們的集合。

相關文章
相關標籤/搜索