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);
}