PHP / MySQLで2038年問題の対策
先日打ち合わせの際に「タイムスタンプを使ってユニークキーに云々~~」といったような内容の話があがり、その際に(あれ、タイムスタンプと言えば2038年問題がネックになるんじゃなかったっけ)と思ったものの、2038年問題の対策については勉強していなかったのでその場はスルーした。そのままにしておく訳にもいかないのでPHP / MySQLでの2038年問題の対策方法を以下にメモ。
2038年問題とは
32bit版OSだとタイムスタンプは「2147483647」までしか取り扱えず、最大値を超えてオーバーフローすると誤動作する可能性がある。尚、64bit版OSだと大丈夫みたい。
ちなみに32bitか64bitかを調べるにはSSH接続して以下コマンドを打つと確認できる。
#以下コマンドを打つ uname -a #当方の環境では以下が出力された(64bit版OS) Linux i-12100000189047 3.10.0-1160.36.2.el7.x86_64 #1 SMP Wed Jul 21 11:57:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
PHPでの対策
date関数及びstrtotime関数は使わない
DateTimeクラスを使用する。よく使いそうなソースコードは以下の通り。
#現在日時を出力 $date = new DateTime(); echo $date->format('Y-m-d H:i:s'); #任意の日時を出力 $date = new DateTime('2023-03-03 14:00:00'); echo $date->format('Y-m-d H:i:s'); #任意の日時から〇時間、日、週、月後を出力 $date = new DateTime('2023-03-03 14:00:00'); echo $date->modify('+1 hours')->format('Y-m-d H:i:s'); echo $date->modify('+1 days')->format('Y-m-d H:i:s'); echo $date->modify('+1 weeks')->format('Y-m-d H:i:s'); echo $date->modify('+1 months')->format('Y-m-d H:i:s');
MySQLでの対策
TIMESTAMP型を使わない
DATE型やDATETIME型を使用する。また、タイムスタンプのデータを格納したい場合はINT型やBIGINT型を使用する。
所感
PHPのdate関数及びstrtotime関数をよく使っていたので今後はDateTimeクラスを使うように気を付ける。また、他にも対策が必要な問題点が見つかれば追記する。
参考サイト
関連記事
-
MySQLでphpMyAdminやAdminer上だけ文字化けする場合の対応方法
レンタルサーバーのプログラムでWebページ上では文字化けしていないのに、phpM ...
-
MySQLで1対多というテーブル構造でデータ結合と条件検索する方法
MySQLで飲食店舗テーブルと休業日テーブルがあり、1店舗に対して複数行の休業日 ...
-
さくらインターネットでCronからmysqldumpすると0バイトのファイルが生成される
さくらインターネットのレンタルサーバでmysqldumpした結果をファイルとして ...
-
MySQLにてSELECT時にdate型のカラムから干支(十二支)を計算し表示する方法
MySQLにdate型のカラムに誕生年月日が格納されており、そこから干支(十二支 ...
-
MySQLでデータの集計時に1日の起点を任意の時間に変更する方法
MySQLで1日毎の集計を行う際、例えば2020/01/01のデータは2020/ ...