サイズがでかくて保存できない問題【Row size too large】

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.'

varcharを複数行持っていて、varcharで最大まで保存しようとすると
varcharは可変なので、量が多いときだけ怒られるみたいなんですよね。

なので、TEXTに変えたんですが、まだおこられる。
TEXTに変えれば、行にはポインタが保存されて、データは別の場所に保存されると思っていたんですが、

InnoDBでは、TEXTやBLOB型のデータは、データのサイズに応じて行内に保存される可能性があるらしく、
それを変更するには、ROW_FORMATを変更する必要があるみたいでした。

ROW_FORMATを変更する

file
mysqlworkbenchからも変更できました。

ALTER TABLE `hoge_db`.`hoge_table`
ROW_FORMAT = DYNAMIC ;

SQLはこんな感じで変更してください

ROW_FORMATの選択肢

COMPACT

これはInnoDBのデフォルトの行形式で、MySQL 5.0.3以降で利用可能です。
特徴: COMPACT 形式は、空間効率を向上させるために設計されています。VARCHAR、VARBINARY、BLOB、TEXT フィールドのプレフィックス(先頭部分)のみを行内に格納し、残りの部分は行外に格納されることがあります。これにより、より多くの行が同じページに収まるようになります。

REDUNDANT

これは古い行形式で、MySQL 5.0.3以前のバージョンでデフォルトでした。
特徴: REDUNDANT 形式は、より多くのメタデータを保持し、空間を効率的に使用しないことが特徴です。新しいバージョンのMySQLやMariaDBでは推奨されません。

DYNAMIC

この形式は、COMPACT 形式をベースに、BLOB、TEXT、VARCHAR などの変動するサイズの列をより効率的に扱います。
特徴: DYNAMIC 形式では、これらのデータ型の列について、行外により多くのデータを格納することができます。これにより、行サイズの問題を軽減し、全体的なデータベースのパフォーマンスを向上させることができます。

COMPRESSED

この形式は、行データを圧縮して格納します。
特徴: COMPRESSED 形式は、ディスクスペースを節約するためにデータを圧縮し、行外に保存します。これは、ディスク容量が限られている環境や、読み取り操作が書き込み操作よりも頻繁に行われる環境に適しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です