【MySQL】 Got error 139 from storage engine → text, blobのカラムが多すぎ
問題
MySQLでSQLを実行したら、こんなエラーが返ってきた。
Got error 139 from storage engine
これは何?
答え
参考: InnoDBテーブル上の制約
VARCHAR、BLOB そして TEXT カラム以外の最大行長は、データベース ページの半分よりも少し短いです。
これは、最大行長は約8000バイトであるという事です。
(中略)
InnoDB が行内の VARCHAR、BLOB、または TEXT カラムの最初の768バイトを格納し、残りは別のページに格納されます。
InnoDBの行サイズの上限はページサイズの約半分で、デフォルトでページサイズは16KBなので、デフォルトでは約8000バイト(変更したいときは再コンパイル)。
可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)のデータは行の外部に保存されるが、先頭の768バイトは行の内部に保存される。
そのため、ひとつのテーブルにTEXT型のカラムを10個作ると、運がよければ(他にカラムが少なければ)、1レコード8000バイトに収まることが多く、問題に気づかないこともある。
ひとつのテーブルに11個のTEXT型フィールドを作り、それぞれに768バイト以上のデータを入れようとすると、768*11=8448 > 8000 なので保存できない。
このときのエラーが
Got error 139 from storage engine
なお、InnoDBでなくてもよい場合では、テーブルをMyISAMに変換することで回避できる。
ALTER TABLE TABLE_NAME ENGINE=MyISAM;
データタイプが必要とする記憶容量によると、「MyISAM テーブル内の行の最大サイズは65,534バイトです。BLOB と TEXT カラムはそれぞれ、このサイズに対してたった5から9バイトを占めています。」ので、同様の問題が発生することはほぼない。
コメント