MySQLでCSVインポート時に Got error 139 from storage engine エラー
定期的にメンテしているWebアプリの、あるテーブル(マスタ系)にcsvデータをインポートするときに出たエラー。一度くらい見た記憶があったが、どんな対応をとったか忘れていたので、今回はメモを残す。
photo credit: Yuri Yu. Samoilov via photopin cc
サマリー
2.原因と解決策
テーブルがInnoDBであったのが原因。InnoDBの行サイズの上限はデフォルトでは約8000バイト。
varchar型などのテキストデータは先頭の768バイトのみ内部に保存され、それ以外は外部に保存される仕組み。
なのでvarchar型のフィールドを多く(X個)持つ場合、その先頭「768バイト * X」だけで8000バイトを超えてしまう場合があるので、そのような場合に上記エラーとなってしまう。
以下でMyISAMに変換することで、正常にcsvがインポートできる状態となる。
alter table my_table engine=MyISAM;
3.MyISAMとInnoDBの利点・欠点
- テーブルロック方式のため、気軽に更新をかけにくい(更新処理の期間は排他ロックされる)
- 壊れやすい(壊れたらrepare必要)
- 更新なしテーブルでは高速
- 全文検索に有利
以上。
あわせて読みたい
PHPからODBC経由でoracleデータベースへ接続するための記述 - TechNote単純な接続方法だが、意外にハマったのでメモを残す。1.COMを使った接続方法(ADODB)2.odbc_connectを使った接続方法1.COMを使った方法(A...
PHP+ACCESSでの文字化けについて - TechNoteAccessとの入出力は全てShift-JISになる。ほとんどの場合、結果取得やデータ更新時は文字エンコードが必要。テーブルより取得したデータを画面表示する前$...
プログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNote基本情報技術者試験や応用情報技術者試験の時期も近まった今、あらためて整列アルゴリズムをまとめてみたので、忘備録を兼ねてメモを残します。即席コードも併せて記載しま...