Laravelのmigrationで指定されたキーが長すぎますと言われた時の対処法
はじめに
Laravelの勉強でマイグレーションした時に同じエラーに度々遭遇しているので、記録として残しておこうと思います。
エラー文
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))
日本語に訳すとキーの最大長が767バイトなのにそれ以上になっているよということでした。
似たようなエラーの解決する記事を発見しました。そのため、まず自分のmysqlのバージョンを確認します。
$ mysql --version
mysql Ver 14.14 Distrib 5.6.51, for osx10.16 (x86_64) using EditLine wrapper
マイグレーションファイルでvarcharカラムの大きさを指定しなかった場合、varchar(255)のカラムが作成されます。UNIQUE_KEYを指定すると、最大767バイトまでしかは入りません。Laravel5.4からデフォルトでの文字セットはutf8mb4に変更されました。このutf8mb4は1文字4バイト使用するため、255*4=1020バイトとなり、767バイトの制限を超えてしまいます。
解決方法
app\Providers\AppServiceProvider.phpを以下のようにします。
public function boot()
{
Schema::defaultStringLength(191);
}
こうすることで設定をしなかった時の最大の長さが191文字となり191*4=764バイトとなり767バイトを超えなくなります。
ここにこのように記述する理由は、bootメソッドはすべてのサービスプロバイダが登録された後に実行されるからです。これにより、データベースサービスが正しく登録、初期化された後に適用されます。使用されているサービスプロバイダの一覧は、config/app.phpのproviders配列のリストで確認ができます。
終わりに
参考文献に記事にも書いてありますが、特別な理由がなければMySQLのバージョンアップするのが一番よさそうです。他に困っている人の助けになれば幸いです。
参考文献
Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
公式ドキュメント Service Providers
Discussion