Larave5 migrationの

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max k
ey length is 767 bytes (SQL: alter table users add unique users_email_unique(email)
)

  • Laravel5.5
  • MariaDB 10.1.28-MariaDB – Source distribution
  • php artisan migrateで発生

MariaDBだったら大丈夫だろうと思っていたら駄目でした。MySQLだったらver5.7.7以降で解消されているらしいです。
MySQLではPRIMARY_KEYおよびUNIQUE_KEYを付けたカラムには最大767bytesまでしか入らないという問題で、utf8mb4を利用した場合には1文字4bytesになったので長さ的に矛盾してしまったということらしいです。767bytes以上入らないように人工的に制御してやると大丈夫っぽい。

Laravel5のマイグレーションで、PRIMARY_KEY,UNIQUE_KEYが設定されているemailカラムの作成時に以下のデフォルトのメソッドを実行した際には、email varchar(255)で作成されてしまう。

$table->string('email')->unique();

ので、これをemail varchar(191)で作成されるように変更します。やたらと長いメールアドレスが入らないことになりますが、そういうのはほとんどないので問題にならないです。
app\Providers\AppServiceProvider.phpに以下を追加します。

// app\Providers\AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

これを設定してから、migrateします。

php artisan migrate:refresh
php artisan migrate
Migration table created successfully.

同じエラーでコケたらmigrationテーブルとusersテーブルを物理削除してください。(たぶん大丈夫)


Laravel5.4 + MySQL5.5.9 でusersテーブルのマイグレーション時に Syntax error

Last update: 2018.04.01 (日)