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を支持する議論:
TIMESTAMPが私に与える唯一の利点は、mysqlテーブルから手動で値を読み込んでいて、それらを「確認」する必要がある場合です。
UNSIGNED INTではなくTIMESTAMPを使用する説得力のある理由はありますか?
TIMESTAMPの引数
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タイムスタンプ」への変換を行わずに、内部タイムスタンプ値を直接返します。
TIMESTAMPの実際の唯一の用途は、行が更新されたときにそのフィールドを自動的に更新する場合(そのフィールドのデフォルトの動作)、またはデータストレージの要件が非常に厳しく、行ごとに4バイトで実際に違いがある場合です。君は。
実際には、比較はDATETIMEとUNSIGNED INTの間で行う必要があります。次の理由から、DATETIMEをお勧めします。
SELECT UNIX_TIMESTAMP(field) FROM table
、生の値を選択してstrtotimeを使用する必要はありません私の意見では、ポイント2だけで整数に格納する理由が本当になくなります。
これは「科学的な」答えではないかもしれませんが、MySqlが変換、算術、比較などを処理する方法は常にTIMESTAMP列で混乱します。 UNSIGNED INTカラムははるかに単純であり、私は常に何を期待するかを知っています。
追伸おそらく、TIMESTAMP列を支持するもう1つのことは、更新または挿入のたびに現在の時刻に自動的に設定される機能ですが、これはなくてはなりません。