勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHP / MySQLで2038年問題の対策

  PHP MySQL データベース

先日打ち合わせの際に「タイムスタンプを使ってユニークキーに云々~~」といったような内容の話があがり、その際に(あれ、タイムスタンプと言えば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クラスを使うように気を付ける。また、他にも対策が必要な問題点が見つかれば追記する。

 

参考サイト

https://qiita.com/re-24/items/c3ed814f2e1ee0f8e811

 - PHP MySQL データベース

  関連記事

MySQLで日時や日付で範囲検索する際に動作速度を向上させる方法

MySQLでログ系等の大量にデータが格納されているテーブルから日時や日付で範囲検 ...

MySQLでカラム数の異なるテーブルを結合する(UNION)

MySQLでカラム数の異なるテーブル同士をUNIONで結合させたかった。ただ、何 ...

プリペアドステートメント

個人的に得た内容として、SQL文だけ先にDBに送って、 変数は後で送る。だからS ...

PHPからMySQLにシリアライズしたデータを格納

アンケートフォームみたいなのがあって、 今後も定期開催し、尚且つ質問内容は増減す ...

MySQLでストアドプロシージャ戻り値対応版であるストアドファンクションの設定と利用方法

先日MySQLのストアドプロシージャに関するメモを書いたが、今回はストアドファン ...