SQLSTATE[4200]:Syntax error or access violation:1071 Specified key was too long解決方法
MySqlがサポートするutf 8符号化の最大文字長は3バイトで、4バイトのワイド文字に遭遇すると挿入異常が発生します.3バイトUTF-8の最大符号化可能なUnicode文字は0 xffff、すなわちUnicodeにおける基本的な多言語平面(BMP)である.従って、Emoji表情(Emojiは特殊なUnicode符号化である)を含む非基本多言語平面のUnicode文字は、MySqlのutf 8文字セットを使用して記憶できない.
これがLaravel 5.4が4バイト長のutf 8 mb 4文字で符号化された理由の一つであるはずだ.ただし、utf 8 mb 4文字符号化はMySql 5.5.3以降のみサポートされていることに注意してください(バージョン:selection version();).MySqlバージョンが低すぎる場合は、バージョンの更新が必要です.
注意:Laravel 5.3からLaravel 5.4にアップグレードする場合は、文字コードを切り替える必要はありません.
ソリューション
MySqlバージョンを5.5.3以上にアップグレードします.
移行コマンドmigrateによって生成されるデフォルト文字列の長さを手動で設定し、appProvidersAppServiceProviderでSchema::defaultStringLengthメソッドを呼び出して構成を実現します.
これがLaravel 5.4が4バイト長のutf 8 mb 4文字で符号化された理由の一つであるはずだ.ただし、utf 8 mb 4文字符号化はMySql 5.5.3以降のみサポートされていることに注意してください(バージョン:selection version();).MySqlバージョンが低すぎる場合は、バージョンの更新が必要です.
注意:Laravel 5.3からLaravel 5.4にアップグレードする場合は、文字コードを切り替える必要はありません.
ソリューション
MySqlバージョンを5.5.3以上にアップグレードします.
移行コマンドmigrateによって生成されるデフォルト文字列の長さを手動で設定し、appProvidersAppServiceProviderでSchema::defaultStringLengthメソッドを呼び出して構成を実現します.
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}