久しぶりに、LaravelをインストールしてMySQLでデータベースを作り、以下ようにartisanコマンドでマイグレーションしようとしたら、QueryExceptionやPDOExceptionのエラー発生してハマってしまいましたので、その時の対処法をご紹介します。
インストールするLaravelバージョンを飛ばしたので後からわかったのですが、他のバージョンでも同じエラーが発生するらしいです。
マイグレーションのエラー内容
いつものように、テーブルを追加するマイグレーションを実行してみます。
1 |
php artisan migrate |
すると、以下のようなエラーが表示されます。
1 2 3 |
[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標準の認証機能を追加してみます。
1 |
php artisan make:auth |
を実行したところ、やはり似たようなエラーが表示されます。
1 2 3 |
[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からcharasetがutf8mb4に変わり、MySQLでユニーク制約を付けたカラムには767bytesまでしか入らない仕様になっているからだそうです。。
2つの対処法
設定を変更する前に、1度マイグレーションに失敗すると、以下のテーブルが残っていると思いますので、以下のテーブルを綺麗に削除してください。
- migrations
- users
余談ですが、今後のことを考え、GUIで簡単にデータベースを操作できるよう「adminer.php」を入れることをオススメします。
1. AppServiceProvider.phpを変更
[app/providers/AppServiceProvider.php
]ファイルを書き換え、デフォルトのバイト数を指定します。
そうすると、次回からマイグレーションファイルを作成した際にバイト数を設定しなくてもエラーが発生することはありません。
まずは、先頭の方に以下を追加します。
1 |
use Illuminate\Support\Facades\Schema; |
それから、bootメソッド内に[Schema::defaultStringLength(191);
]を追加します。
1 2 3 4 |
public function boot() { Schema::defaultStringLength(191); } |
これでマイグレーションを実行してもエラーは発生しなくなります!
2. create_users_table.phpを変更
もう1つはマイグレーションファイルを書き換える方法です。
[database/migrations/2014_10_12_000000_create_users_table.php
]ファイルを開いて、エラーで表示されていた箇所を見てみます。
1 |
$table->string('email')->unique(); |
このstringメソッドの第2引数にバイト数を入力します。
1 2 3 4 5 6 7 8 9 10 11 |
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を変えるなどの対処法があるようなので、知りたい方は以下の参考サイトをご覧ください。
コメント
コメント一覧 (1件)
[…] artisan migrateをするとエラーになるのです。 Laravel 5.5でマイグレーションのエラーが発生した場合の2つの対処法https://minory.org/laravel-migrate-error.htmlLaravel […]