エラー内容

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

 

発生条件と原因

767バイト以上を許容するカラムにインデックスを貼ろうとすると発生するエラー。

バイト数は文字コードに依存する。

 

対処法

・文字コードを変更する

例えばutf8mb4に対してutf8の方がバイト数が少ないので変更する

            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',

            ↓
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',

カラムをピンポイントで修正する場合は以下のSQLを実行する。

ALTER TABLE users MODIFY email varchar(255) CHARACTER SET utf8;

Laravelのテーブル定義を変える場合は以下のようにする。

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

 

・カラムの許容バイト数を制限する

・large_prefixを使用する