これをコミュニティ wiki としてマークしたので、自由に編集してください。
2038年問題とは一体何なのか?
「2038 年問題 (Unix ミレニアム バグ、Y2K 問題に類推して Y2K38 としても知られています) は、2038 年以前または 2038 年に一部のコンピューター ソフトウェアに障害を引き起こす可能性があります。この問題は、システム時刻を符号付き 32 として保存するすべてのソフトウェアとシステムに影響します。 -ビット整数で、この数値を 1970 年 1 月 1 日の 00:00:00 UTC からの秒数として解釈します。"
なぜ発生し、発生するとどうなるのですか?
2038 年 1 月 19 日火曜日の 03:14:07 UTCを超える時間は「折り返し」、負の数として内部的に保存されます。これらのシステムは、2038 年ではなく 1901 年 12 月 13 日の時間として解釈します。 UNIX エポック (1970 年 1 月 1 日 00:00:00 GMT) からの秒数が、コンピューターの 32 ビット符号付き整数の最大値を超えるという事実。
どうすれば解決できますか?
- long データ型を使用する (64 ビットで十分)
- MySQL (または MariaDB) の場合、時間情報が必要ない場合は、
DATE
列タイプの使用を検討してください。より高い精度が必要な場合は、DATETIME
ではなくを使用してくださいTIMESTAMP
。列にはタイムゾーンに関する情報が保存されないことに注意してDATETIME
ください。そのため、アプリケーションはどのタイムゾーンが使用されたかを知る必要があります。
- ウィキペディアに記載されているその他の可能な解決策
- MySQL 開発者が10 年以上前に報告されたこのバグを修正するのを待ちます。
同様の問題を引き起こさない、それを使用する代替手段はありますか?
データベースに日付を格納するために可能な限り大きな型を使用するようにしてください。64 ビットで十分です。GNU C と POSIX/SuS、またはsprintf('%u'...)
PHP または BCmath 拡張機能の long long 型です。
まだ 2038 年ではありませんが、壊れる可能性のあるユース ケースにはどのようなものがありますか?
したがって、MySQL DATETIMEの範囲は 1000 ~ 9999 ですが、TIMESTAMP の範囲は 1970 ~ 2038 のみです。あなたのシステムが生年月日、将来の将来の日付 (例えば 30 年の住宅ローン) などを保存している場合、すでにこのバグに遭遇することになります。繰り返しますが、これが問題になる場合は TIMESTAMP を使用しないでください。
TIMESTAMP を使用する既存のアプリケーションに対して、いわゆる問題が実際に発生したときに回避するにはどうすればよいでしょうか?
2038 年になっても残っている PHP アプリケーションはほとんどありませんが、Web はまだほとんどレガシー プラットフォームではないため、予測するのは困難です。
に変換するデータベース テーブルの列を変更するプロセスを次に示しTIMESTAMP
ますDATETIME
。一時的な列を作成することから始めます。
# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;
# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;
# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);
# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`
資力