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 處理,彈性反而比內建功能大不少。

5 thoughts on “MySQL 裡儲存時間的方式...”

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

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

Leave a Reply

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