SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【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バイトを占めています。」ので、同様の問題が発生することはほぼない。

関連するメモ

コメント