Help us understand the problem. What is going on with this article?

Laravel:SQLSTATE[42000]Syntax error or access violation...bytesの解決

【概要】

1.結論

2.SQLSTATE[42000]とは何か

3.なぜこのエラーになったのか

4.どのように解決したのか

5.参考URL

6.開発環境

1.結論

app/Providers/AppServiceProviderpublic function boot()Schema::defaultStringLength(191);を記載する!

2.SQLSTATE[42000]とは何か

アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。

3.なぜこのエラーになったのか

結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)

4.どのように解決したのか

app/Providers/AppServiceProvider
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

taka_no_okapi
『笑謝を、自分らしく、続け、』 #HTML #CSS #Javascript #Ruby #PHP #AWS #docker #ci #Vuejs 勉強中! 全くの未経験、0の状態から学習中! みなさんが同じところでつまずいた際に 少しでも共有できればと思い、作りました!
https://twitter.com/taka_taka_tech
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away