Laravelで開発してると頻繁に出くわすこのエラー

SQLSTATE[42000]: Syntax error or access violation: 1071 
Specified key was too long; max key length is 767 bytes 

MySQLの環境次第では、インデックスできるキーは768バイトまでなので環境によってはこれが弊害になるので解決策をまとめます。

原因

Laravelの文字コードはLaravel5.4以降utf8mb4を使うようになりました。

以前はutf8。

utf8では1文字3バイトだったものが、絵文字範囲をカバーするためにutf8mb4では1文字4バイトになっています。

そのため、制限の767バイトを超過してしまい、MySQLのエラーが出力されることに。

解決法(2こ)

MySQLの設定を変更できる場合

my.cnfに以下の記述をすればOK

[mysqld]
innodb_large_prefix
innodb_file_per_table
innodb_file_format=Barracuda

innodbのファイルフォーマットがBarracudaになるので、インデックス長さが拡大されるので解決。

MySQLの設定を変更できないならLaravel側で対応

AppServiceProviderに以下の記述を追加すればindexが短くなるので解決

use Illuminate\Support\Facades\Schema;

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