登録日時・更新日時を記録する場合、TIMESTAMP型かDATETIME型か、それとも…

経験値がないから、どういう型を使えばいいのかでとってもとっても迷うんですよねぇ……(後々影響しまくるし)。
今回は、登録日時・更新日時の場合です。



TIMESTAMP型かDATETIME型の比較

サポート範囲が違う(その結果、消費バイト数が違う)らしい。


のみならず、「コードが更新された時に自動的に現在時刻でTIMESTAMP型のカラムを更新できる」らしい(おお?
しかしcurrent_timestampは1カラムだけ。


むー。
2037年なんてまだまだ先だからいいとも言えるけど、素直にDATETIME型を使うのがよさそう。
自動的にってのは楽でよさそうだけど、想定外の動作になりそうで怖いよ。


▽TIMESTAMP型とDATETIME型(suusukeの日記)
 http://d.hatena.ne.jp/suusuke/20081119/1227094456


MySQLでのTIMESTAMP型(PHPプログラマのバリ・ポジ情報ブログ)
 http://blog.veryposi.info/programing/sql/mysql-timestamp/


mysqlのtimestamp型を使って更新日時と生成日時の両方を記録する(いぞるで雑記annex)
 http://isoldeblog.blog93.fc2.com/blog-entry-14.html


MySQL 5.1 リファレンスマニュアル :: 10 データタイプ :: 10.3 日付と時刻タイプ :: 10.3.1 DATETIME、DATE、そして TIMESTAMP タイプ
 http://dev.mysql.com/doc/refman/5.1/ja/datetime.html

DATETIME型か、INT型(UNIXタイムスタンプ)か

色々なところから色々なフォーマットでデータを集めてくる場合、統一したフォーマットで出力するには一度UNIXタイムスタンプにしちゃえばいい。同じデータを何度も変換しないで済んで便利ですよね。どんなフォーマットにも変えられるし。


ただUNIXタイムスタンプでMySQLに格納すると、人間が直接いじるのは面倒だし、パッと見てわからないから不便……。


どっちがいいのかなぁ。
色々みた感じ素直にDATETIME型というのが王道のようなので、素人さんは長いものに巻かれることにします。
UNIXタイムスタンプの方がコーディングは楽な気がするんですけどね(^^;;

結論変更(2009/08/21)


長いものに巻かれちゃいけなかった(--;


MySQLでDATETIME型のデータを高速に検索する方法(FUKAOI.ORG)
 http://blog.fukaoi.org/2009/03/19/mysql_datetime


MySQLでDATETIME型のデータを高速に検索する方法は、「DATETIME型で保存するのではなく、」INT型を使うことだよ、というお話。
条件を揃えて比較した場合、DATETIME型よりINT型が3倍〜4倍高速という結果が示されています。なるほど!


確かに検索することを考えると、INT型の方が優れているでしょうね。考えもしませんでした。


そして環境的に私がコマンドライン等を叩くことはさほど回数があるとは思えない。……原則、phpを通じて、いじるんですから。
管理の際にphpMyAdmin等でUNIXタイムスタンプが表示されたところで、悪影響が生じることは生じにくい。


さらには、登録日時・更新日時で抽出ということは、そう珍しいことじゃない(サービスのデータの更新状況を示すのは利用者にとって大事)。


とすれば、特段の事情が無い限りINT型にすべきですね。反省反省

追記(2010/10/07)

「DATETIMEもTIMESTAMPも、形式が違うだけでどちらも整数で管理されている」とすれば、前提が変わってきますね。
うーん。


個人的には、unixタイムスタンプでの取扱いに慣れちゃったので、ぱっと見わかりにくい以外のマイナスがないならそのまま使うと思いますが。
実際にベンチとってみるって大事ですよね。そろそろちゃんとやらないと。