サイトアイコン IT NEWS

Laravelでマイグレーションのエラーが発生した場合の2つの対処法

laravel-migrate-error

久しぶりに、LaravelをインストールしてMySQLデータベースを作り、以下ようにartisanコマンドマイグレーションしようとしたら、QueryExceptionPDOExceptionエラー発生してハマってしまいましたので、その時の対処法をご紹介します。
インストールするLaravelバージョンを飛ばしたので後からわかったのですが、他のバージョンでも同じエラーが発生するらしいです。

マイグレーションのエラー内容

いつものように、テーブルを追加するマイグレーションを実行してみます。

php artisan migrate

すると、以下のようなエラーが表示されます。

[IlluminateDatabaseQueryException]                                                                                                                                                 
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`)) 

または、Laravel標準の認証機能を追加してみます。

php artisan make:auth

を実行したところ、やはり似たようなエラーが表示されます。

[PDOException]                                                                                                   
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
管理者

何?
どっちもSyntax errorだと??

マイグレーションエラーの原因

結論から言うと、Laravel 5.4からcharasetutf8mb4に変わり、MySQLユニーク制約を付けたカラムには767bytesまでしか入らない仕様になっているからだそうです。。

2つの対処法

設定を変更する前に、1度マイグレーションに失敗すると、以下のテーブルが残っていると思いますので、以下のテーブルを綺麗に削除してください。

  • migrations
  • users

余談ですが、今後のことを考え、GUIで簡単にデータベースを操作できるよう「adminer.php」を入れることをオススメします。

1. AppServiceProvider.phpを変更

[app/providers/AppServiceProvider.php]ファイルを書き換え、デフォルトのバイト数を指定します。
そうすると、次回からマイグレーションファイルを作成した際にバイト数を設定しなくてもエラーが発生することはありません。

まずは、先頭の方に以下を追加します。

use Illuminate\Support\Facades\Schema;

それから、bootメソッド内に[Schema::defaultStringLength(191);]を追加します。

    public function boot()
    {
        Schema::defaultStringLength(191);
    }

これでマイグレーションを実行してもエラーは発生しなくなります!

2. create_users_table.phpを変更

もう1つはマイグレーションファイルを書き換える方法です。
[database/migrations/2014_10_12_000000_create_users_table.php]ファイルを開いて、エラーで表示されていた箇所を見てみます。

$table->string('email')->unique();

このstringメソッドの第2引数にバイト数を入力します。

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email', 255)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

他にもMySQLバージョンcharasetを変えるなどの対処法があるようなので、知りたい方は以下の参考サイトをご覧ください。

モバイルバージョンを終了