42

日付と時刻の値を 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 タイムスタンプは、Sun, 07 Feb 2106 06:28:15 GMT に変換されます。これは TIMESTAMP よりも多く、私にとっては十分です
  • strtotime() で TIMESTAMP を変換してから比較するよりも、これらのタイムスタンプを PHP で直接比較する方が高速です。

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

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

4

4 に答える 4

30

TIMESTAMP の引数

  • 暗黙的にデータを UTC タイム ゾーンで保存します。セッションのタイムゾーンに関係なく。異なるタイム ゾーンを使用する必要がある場合に便利です。
  • DEFAULT CURRENT_TIMESTAMPorを使用して自動タイムスタンプ列を持つことができますON UPDATE CURRENT_TIMESTAMP(MySQL 5.6.5 までは、テーブルごとに 1 つの列のみ)
  • 関数を使用せずに、日付の比較、加算、減算、範囲検索などに datetime 関数を使用できます。FROM_UNIXTIME()これにより、インデックスを使用できるクエリを簡単に作成できます。
  • PHPで

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

    したがって、範囲は実際には同じです

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

于 2011-08-11T16:14:34.240 に答える
8

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

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

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

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

于 2011-08-11T16:41:45.913 に答える
5

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

PSおそらく、TIMESTAMP列を支持するもう1つの点は、更新または挿入のたびに現在の時刻に自動的に設定される機能ですが、それなしでは生きていけないものではありません。

于 2011-08-11T16:15:18.143 に答える