web-dev-qa-db-ja.com

MySQLのTIMESTAMPの使用とタイムスタンプの直接保存の比較

MySQLのTIMESTAMP形式とカスタムのUNSIGNED INT形式で日付と時刻の値を保存することについてジレンマに陥っています。ここでの主な考慮事項は、検索の速度、PHPでの適切な範囲の計算、および人間が読める値への時折のフォーマット設定です。

各タイプとその範囲に必要なストレージスペース:

DATETIME        8 bytes  '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP       4 bytes  '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC
UNSIGNED INT    4 bytes  (Maximum Value 4294967295)

DATETIMEの範囲はまったく必要ありません。 TIMESTAMPとUNSIGNED INTの間で引き裂かれています。

UNSIGNED INTを支持する議論:

  • 4294967295のUNIXタイムスタンプは、2106年2月7日06:28:15 GMTに変換されます。これはTIMESTAMPを超えており、私には十分です。
  • これらのタイムスタンプをPHPで直接比較すると、strtotime()でTIMESTAMPを変換して比較するよりも高速になります。

TIMESTAMPが私に与える唯一の利点は、mysqlテーブルから手動で値を読み込んでいて、それらを「確認」する必要がある場合です。

UNSIGNED INTではなくTIMESTAMPを使用する説得力のある理由はありますか?

37
siliconpi

TIMESTAMPの引数

  • 暗黙的にUTCタイムゾーンでデータを格納します。セッションのタイムゾーンに関係なく。異なるタイムゾーンを使用する必要がある場合に役立ちます。
  • _DEFAULT CURRENT_TIMESTAMP_または_ON UPDATE CURRENT_TIMESTAMP_(MySQL 5.6.5まではテーブルごとに1列のみ)を使用して、自動タイムスタンプ列を設定できます。
  • FROM_UNIXTIME()関数を使用する必要なしに、日付比較、加算、減算、範囲ルックアップなどにdatetime関数を使用できます-インデックスを使用できるクエリを簡単に作成できます
  • PHPで

    _>> date('Y-m-d h:i:s',4294967295);
    '1969-12-31 11:59:59'
    _

    範囲は実際には同じです

UNIX_TIMESTAMP()がTIMESTAMP列で使用される場合、関数は暗黙的な「文字列からUNIXタイムスタンプ」への変換を行わずに、内部タイムスタンプ値を直接返します。

28
Mchl

TIMESTAMPの実際の唯一の用途は、行が更新されたときにそのフィールドを自動的に更新する場合(そのフィールドのデフォルトの動作)、またはデータストレージの要件が非常に厳しく、行ごとに4バイトで実際に違いがある場合です。君は。

実際には、比較はDATETIMEとUNSIGNED INTの間で行う必要があります。次の理由から、DATETIMEをお勧めします。

  • MySQLのネイティブの日付/時刻関数を使用して、日付範囲などで選択できます。
  • PHPで簡単にフォーマットできるように、これらの日付をUNIXタイムスタンプとして選択することは簡単です:SELECT UNIX_TIMESTAMP(field) FROM table、生の値を選択してstrtotimeを使用する必要はありません
  • (指摘したように)必要に応じて、データベースのフィールドを直接読み取って編集するのが簡単になります。
  • 日付範囲に制限はありません

私の意見では、ポイント2だけで整数に格納する理由が本当になくなります。

9
Tim Fountain

これは「科学的な」答えではないかもしれませんが、MySqlが変換、算術、比較などを処理する方法は常にTIMESTAMP列で混乱します。 UNSIGNED INTカラムははるかに単純であり、私は常に何を期待するかを知っています。

追伸おそらく、TIMESTAMP列を支持するもう1つのことは、更新または挿入のたびに現在の時刻に自動的に設定される機能ですが、これはなくてはなりません。

3
nobody