🕐

Laravel + MySQL timestamp型の2038年問題対策

2023/08/28に公開

はじめに

Laravel + MySQLでのtimestamp型の2038年問題対策についてまとめました。

2038年問題とは

https://e-words.jp/w/2038年問題.html

MySQLでの問題点

TIMESTAMP型は、1970-01-01 00:00:01 UTC から 2038-01-19 03:14:07 UTC の範囲であることが書かれています。

https://dev.mysql.com/doc/refman/8.0/ja/datetime.html

データベースでの対策方法

MySQLのDATETIME型を使用する

DATETIME型は、9999-12-31 23:59:59が最大値なので
こちらを利用することで対策が可能です。

PostgreSQLを使用する

PostgreSQL 8.4以降では、TIMESTAMP型は8バイトになっており
2038年問題は解決済みです。

https://www.postgresql.jp/docs/9.2/datatype-datetime.html

Laravelマイグレーションでの対策方法

timestamp型をdatetime型に変更します。

deleted_at、created_at、updated_at をdatetime型にする

Laravel10以前

古いバージョンのLaravelでは、専用のメソッドは使用せず、datetimeメソッドを使って追加します。

    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->datetime('deleted_at')->nullable();
            $table->datetime('created_at')->nullable();
            $table->datetime('updated_at')->nullable();
        });
    }
\Illuminate\Database\Schema\Blueprint 参考

https://readouble.com/laravel/9.x/ja/migrations.html

https://readouble.com/laravel/9.x/ja/eloquent.html

Laravel10〜

Blueprintの新メソッド「softDeletesDatetime」、「datetimes」を使って追加します。

    public function up(): void
    {
        Schema::create('contents', function (Blueprint $table) {
            $table->id();
            $table->softDeletesDatetime();
            $table->datetimes();
        });
    }
\Illuminate\Database\Schema\Blueprint コミット

2023/8現在では、ドキュメントの方には、まだ記載がないようです。

https://laravel.com/docs/master/migrations

https://laravel.com/docs/master/eloquent

https://readouble.com/laravel/10.x/ja/migrations.html

https://readouble.com/laravel/10.x/ja/eloquent.html

関連書籍

https://amzn.to/3O7Td5A

https://amzn.to/3WXfMhn

https://amzn.to/3J7lpUn

https://amzn.to/43BUpom

https://amzn.to/45VnX1E

Discussion