MySQL テーブルにカラムを追加しようとしたら「Row size too large」と怒られた

FuelPHPのマイグレーションを実行したら「Row size too large」と怒られた

作成日:2023-01-27, 更新日:2023-01-27

対応まで

FuelPHPのマイグレーションを実行したら怒られた

▼そのときのエラー

SQLSTATE[42000]: Syntax error or access violation: 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs with query: "ALTER TABLE `xxxx`

調べると「テキスト型」が多いと怒られるらしい
で、私の場合は「テキスト型」は無く文字列の型は「varchar(255)」のみ。
ココでいう「テキスト型」ってのは「文字列の型全般」を指しているのかな…不明

でもエラーメッセージを見ると「Row size too large.」とあるからテキスト型は関係ないような気がする…
テキスト型が多くて「Row size too large.」になることもあるけどテキスト型関係なしで「Row size too large.」となることもあるような気がするんだけど…どうなんだろう?

細かいことはいいので重要なのは対策方法

対策方法

  • カラムを減らす
  • 各カラムの各型をシビアにして容量を調整する
  • テーブルのROW_FORMATの設定を変更する

カラムを減らす

すでに稼働しているシステムなので…対策方法としては無し

各カラムの各型をシビアにして容量を調整する

すでに稼働しているシステムなので…対策方法としては無し

テーブルのROW_FORMATの設定を変更する

対象テーブルの「ROW_FORMAT」を「Dynamic」にすれば良いらしい

「ROW_FORMAT」を「Dynamic」に変更

▼クエリ

alter table 「テーブル名」 ROW_FORMAT=DYNAMIC;

▼「テーブル名: tbl_hoge」の場合

alter table tbl_hoge ROW_FORMAT=DYNAMIC;

「ROW_FORMAT」の確認

▼クエリ(全テーブル)

show table status;

▼クエリ(対象テーブルのみ)

show table status where `Name`=「テーブル名」;

▼「テーブル名: tbl_hoge」の場合

show table status where `Name`= "tbl_hoge";