みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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
と表示されております。

投稿日時 - 2018-12-12 11:49:27

QNo.9567047

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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ビットに拡張されるのを待たなくてはなりません。

投稿日時 - 2018-12-12 14:05:35

お礼

ありがとうございます。
>NOW関数はDATETIME関数と同系統の関数です。
こちら、公式な仕様などはありますでしょうか?


>timestampは1970-01-01からの時間を符号付き32ビットの秒数+小数部で記録するので、1970-01-01から2147483647秒後までしか表現出来ません。

TIMESTAMP型は理解しています。
set timestampで設定した場合にnow()の値が変化するので、これを仕様的にどう解釈するべきか悩んでいる次第です。

投稿日時 - 2018-12-12 15:38:18

あなたにオススメの質問