これをコミュニティウィキとしてマークしましたので、ご自由に編集してください。
2038年問題とは正確には何ですか?
「2038年の問題(Unix Millennium Bug、Y2K38はY2K問題の類義語として知られています)により、一部のコンピュータソフトウェアが2038年以前または2038年に失敗する可能性があります。この問題は、システム時刻を署名付きで保存するすべてのソフトウェアとシステムに影響します32ビット整数。この数値は、1970年1月1日のUTC 00:00:00からの秒数として解釈されます。」
なぜそれが発生し、それが発生するとどうなりますか?
2038年1月19日火曜日の03:14:07 UTCを超える時間は「折り返し」、負の数として内部に格納されます。これらのシステムは、2038年ではなく1901年12月13日の時間として解釈します。これは、 UNIXエポック(1970年1月1日00:00:00 GMT)からの秒数が、コンピューターの32ビット符号付き整数の最大値を超えたという事実。
どうすれば解決できますか?
- 長いデータ型を使用する(64ビットで十分)
- MySQL(またはMariaDB)では、時間情報が必要ない場合は、
DATE
列タイプの使用を検討してください。より高い精度が必要な場合は、ではDATETIME
なくを使用してくださいTIMESTAMP
。DATETIME
列にはタイムゾーンに関する情報が格納されないことに注意してください。そのため、アプリケーションはどのタイムゾーンが使用されたかを知る必要があります。
- ウィキペディアに記載されている他の可能な解決策
- MySQL開発者が10年以上前に報告されたこのバグを修正するのを待ちます。
同様の問題を引き起こさない、可能な代替手段はありますか?
データベースに日付を格納するために可能な限り大きな型を使用してみてください。64ビットで十分sprintf('%u'...)
です。GNUC とPOSIX / SuS、または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`
資源