久しぶりに、LaravelをインストールしてMySQLでデータベースを作り、以下ようにartisanコマンドでマイグレーションしようとしたら、QueryExceptionやPDOExceptionのエラー発生してハマってしまいましたので、その時の対処法をご紹介します。
インストールする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からcharasetがutf8mb4に変わり、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を変えるなどの対処法があるようなので、知りたい方は以下の参考サイトをご覧ください。
- Original:https://minory.org/laravel-migrate-error.html
- Source:Minory
- Author:管理者
Amazonベストセラー
Now loading...