MySQL 裡儲存時間的方式...

這應該是 MySQL 的 best practice 之一,不知道為什麼 Baron Schwartz 又拿出來講:「A simple rule for sane timestamps in MySQL」。

MySQL 內可以儲存「日期與時間」的資料型態是 DATETIME 與 TIMESTAMP 兩種,不過 DATETIME 沒有時區觀念,而 TIMESTAMP 只能是 UTC (GMT+0)。

相較於隔壁棚 PostgreSQLDate/Time Types 就一種 TIMESTAMP,但支援 with timezone 與 without timezone 直接解決問題。

這使得 MySQL 上在儲存「日期與時間」以及處理的時候一直有種 WTF 的感覺...

就如同 Baron Schwartz 的建議,如果使用 MySQL,目前比較好的方法是用 INT UNSIGNED NOT NULL 儲存,把 timezone 的處理都放到應用程式端來處理,這樣產生的問題會比較少...

真的需要在 INSERT 或是 UPDATE 時更新欄位,可以用 trigger 處理,彈性反而比內建功能大不少。

This entry was posted in Computer, Database, Murmuring, MySQL, Software and tagged , , , , , , , , , , , . Bookmark the permalink.

3 Responses to MySQL 裡儲存時間的方式...

  1. Buganini says:

    用TIMESTAMP的話,SET TIME_ZONE就可以自動轉了吧,DATETIME則完全是個鳥蛋,送進去的字串就算有帶時區也會被忽略

  2. Buganini says:

    不過DATETIME倒也不是全無用途,如果要儲存client作息相關的資訊時候,就會需要存local time,這時候timestamp會被time_zone轉來轉去,拿datetime來用就不錯,用timestamp的話就要另外存client的時區換算回來。

  3. okwap says:

    原文?http://www.xaprb.com/blog/2014/01/30/timestamps-in-mysql/

Leave a Reply

Your email address will not be published. Required fields are marked *