🌿

Laravelのmigrationで指定されたキーが長すぎますと言われた時の対処法

2023/09/06に公開

はじめに

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