• 締切済み

MySQL now() 2038年

こんにちは。 MySQLの2038年問題ですが、TIMESTAMPではなく、DATETIMEを使うということはあちこちに書いてあるのですが、now関数の扱いがわからず困っております。 つまり、2038年以降でも、now関数が正常に動作するかどうかですね。 now関数の戻り値はTIMESTAMPなのでしょうか?それともDATETIMEなのでしょうか? set timestampで2038年以降が設定できないのも気になります。 サーバーの日付を変えてみればわかる話ですが、間借りしている状態なので、うかつに変えることはできません。 どなたか、now関数について確認する方法をご存知でしょうか。よろしくお願いします。 OSとPHPに関しては64bitで動作していることを確認しております。 MySQLのstatusは mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1 と表示されております。

みんなの回答

回答No.1

>MySQLの2038年問題ですが、TIMESTAMPではなく、DATETIMEを使うということはあちこちに書いてあるのですが、now関数の扱いがわからず困っております。 NOW関数はDATETIME関数と同系統の関数です。 >つまり、2038年以降でも、now関数が正常に動作するかどうかですね。 2038年以降も正常に動作しますが、タイムゾーンの問題があるので、タイムゾーンを意識しないでそのまま使うと、問題が発生します(NOWもDATETIMEも、タイムゾーンの設定を無視して、すべてUTCとして扱います) >now関数の戻り値はTIMESTAMPなのでしょうか?それともDATETIMEなのでしょうか? DATETIME系列なので、DATETIMEと同じ型で扱われます。 >set timestampで2038年以降が設定できないのも気になります。 timestampは1970-01-01からの時間を符号付き32ビットの秒数+小数部で記録するので、1970-01-01から2147483647秒後までしか表現出来ません。 1970-01-01から2147483647秒後というのは2038-01-19 03:14:07になるので、この「2038-01-19 03:14:07」を越える値は設定出来ません。 SQLがバージョンアップして、timestampが64ビットに拡張されるのを待たなくてはなりません。

titokani
質問者

お礼

ありがとうございます。 >NOW関数はDATETIME関数と同系統の関数です。 こちら、公式な仕様などはありますでしょうか? >timestampは1970-01-01からの時間を符号付き32ビットの秒数+小数部で記録するので、1970-01-01から2147483647秒後までしか表現出来ません。 TIMESTAMP型は理解しています。 set timestampで設定した場合にnow()の値が変化するので、これを仕様的にどう解釈するべきか悩んでいる次第です。

すると、全ての回答が全文表示されます。

関連するQ&A