日期和時間類型
MySQL對於不同種類的日期和時間有很多的資料類型,比如YEAR和DATE。MySQL可儲存時間顆粒度是一秒。然而,時間的計算可以精確到毫秒。我們將會教你如何解決儲存引擎的局限性。
大部分時間類型都沒有什麼可選擇的。所以那個是最佳的選擇不是一個問題。只有一個問題那就是當你即要儲存日期也要儲存時間的時候,將要做什麼。MySQL提供了兩個類型來滿足這個需求:DATETIME和TIMESTAMP.對許多應用而言,任意一個都可以,但是在一些案例中,一個要好於另一個。讓我們來看看:
DATETIME
這個類型可以儲存大範圍的值。從1001到9999.精度精確到了秒。它儲存日期和時間壓縮到為YYYYMMDDHHMMSS格式的整型,獨立的時間地區。這會佔用8位元組的儲存空間。
預設的MySQL顯示DATETIME為排序的,清晰地格式,比如2008-01-16 22:37:08。這是符合ANSI標準的日期和時間。
TIMESTAMP
就像名字所提示的一樣,TIMESTAMP類型儲存了從1970 1.1 開始所經過秒的數量-這個UNIX的TIMESTAMP是一樣的。因此它的範圍要比DATATIME要小一些:從1970年到2038年。MySQL提供了FROM_UNIXTIME和UNIX_TIMESTAMP函數,用來把Unix的timestamp轉為data,反之亦然。
新版的MySQL的TIMESTAMP值像DATETIME.但是舊版MySQL顯示它們沒有任何的標點。僅僅是顯示格式的不同。TIMESTAMP儲存在MySQL的方式在所有MySQL版本中都是一樣的。
TIMSTAMP的現實也依賴於時區。MySQL伺服器,作業系統,用戶端串連所有的都有時區的設定。因此,一個TIMESTAMP存值為0,實際顯示的是東部夏令時間,1969-12-31 19:00:00。相對GMT有5個時差。
TIMESTAMP也有一個DATETIME不具備的屬性。預設的情況下,當你插入一條記錄並沒有指定這個值,MySQL會把TIMESTAMP列設為當前的時間。當你更新這一行的時候,MySQL也會更新TIMESTAMP列。除非你給TIMESTAMP指定一個值。對於任意的TIMESTAMP,你可以配置插入和更新的行為。最終,TIMESTAMP列預設不能為NULL.這點和其他的類型有所不同。
先撇特殊行為不談,一般來說,如果能用TIMESTAMP就應該用,因為它空間上比DATETIME更有效用。有的時候人們用整型來儲存UNIX的TIMESTAMP,但是這麼做不能帶來什麼好處。這麼做也不太容易去處理,我們不建議這麼做。
怎樣儲存比秒更精確的時間?MySQL還沒有這些資料類型,但你可以使用你自己的儲存類型:你可以使用BIGINT類型並且儲存這個值作為在微妙層級的TIMESTAMP,或者你可以使用DOUBLE並且儲存小數點之後的秒的小數部分。