【概要】
1.結論
5.参考URL
6.開発環境
1.結論
app/Providers/AppServiceProvider
のpublic function boot()
にSchema::defaultStringLength(191);
を記載する!
2.SQLSTATE[42000]とは何か
アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。
3.なぜこのエラーになったのか
結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)
4.どのように解決したのか
use Illuminate\Support\Facades\Schema; //⬅︎を追加記載(❶)
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
// 省略
public function boot()
{
Schema::defaultStringLength(191); //⬅︎を追加記載(❷)
}
}
4bytes*191文字=764bytesに抑えることで、規定量以下にしました。これをデフォルト設定にしているのでどのテーブルにもこれが適用されます。Mysqlのバージョンアップもありましたが、手軽かつアプリを使用する際に100文字を超える実装はなかったので今回はこの手段を取りました。また❶を記載しないとエラーが起きます。
5.参考URL
①Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
②【Laravel】migrateでテーブルが存在したらスキップする
6.開発環境
PHP 7.4.10
Laravel 8.9.0
MySQL 5.6.47/SequelPro 1.1.2