久しぶりに、LaravelをインストールしてMySQLでデータベースを作り、以下ようにartisanコマンドでマイグレーションしようとしたら、QueryExceptionやPDOExceptionのエラー発生してハマってしまいましたので、その時の対処法をご紹介します。
インストールするLaravelバージョンを飛ばしたので後からわかったのですが、他のバージョンでも同じエラーが発生するらしいです。
マイグレーションのエラー内容
いつものように、テーブルを追加するマイグレーションを実行してみます。
すると、以下のようなエラーが表示されます。
|
[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標準の認証機能を追加してみます。
を実行したところ、やはり似たようなエラーが表示されます。
|
[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes |

管理者
マイグレーションエラーの原因
結論から言うと、Laravel 5.4からcharasetがutf8mb4に変わり、MySQLでユニーク制約を付けたカラムには767bytesまでしか入らない仕様になっているからだそうです。。
2つの対処法
設定を変更する前に、1度マイグレーションに失敗すると、以下のテーブルが残っていると思いますので、以下のテーブルを綺麗に削除してください。
余談ですが、今後のことを考え、GUIで簡単にデータベースを操作できるよう「adminer.php」を入れることをオススメします。
あわせて読みたい
PHPでDBを参照するならphpMyAdminよりAdminerの方が軽快で便利!
PHPでMySQLやPostgreSQLなどのデータベースを参照する場合、phpMyAdminやphpPgAdminを利用することが多いと思います。または、ローカルにMySQL WorkbenchやpgAdminとい...
1. AppServiceProvider.phpを変更
[app/providers/AppServiceProvider.php
]ファイルを書き換え、デフォルトのバイト数を指定します。
そうすると、次回からマイグレーションファイルを作成した際にバイト数を設定しなくてもエラーが発生することはありません。
まずは、先頭の方に以下を追加します。
|
use Illuminate\Support\Facades\Schema; |
それから、bootメソッド内に[Schema::defaultStringLength(191);
]を追加します。
|
public function boot() { Schema::defaultStringLength(191); } |
これでマイグレーションを実行してもエラーは発生しなくなります!
Laravel News
Laravel: Specified key was too long error - Laravel News
Laravel made a change to the default database character set, and it's now utf8mb4 which includes support for storing emojis. This only affects new applications ...
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を変えるなどの対処法があるようなので、知りたい方は以下の参考サイトをご覧ください。
Qiita
Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する...
はじめに古い備忘録だが、いまだに定期的にアクセスがあるので全面的に加筆修正した。PHPやLaravelは新しいバージョンに追従していても、MySQLのバージョンはいまだ5.5~5....
Qiita
Mysqlでユニーク制約をつけたvarcharは767byteまでしか入らない話 - Qiita
laravelのmigrationを使って、下記のようなテーブルをつくろうとしていたが、何度も、SQLSTATE[42000]: Syntax error or access violation:…
コメント
コメント一覧 (1件)
[…] artisan migrateをするとエラーになるのです。 Laravel 5.5でマイグレーションのエラーが発生した場合の2つの対処法https://minory.org/laravel-migrate-error.htmlLaravel […]