WebEngine

だらだらと綴る技術系メモ

MySQLで大容量のデータを挿入する前に

MySQLに大容量の画像を挿入する前に確認したいこと

ちょっとした画像アップローダPHP+MySQLで実装したのですが、下記のようなエラー を吐きました。

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help.

このエラー、600~700MB以下の画像では出ませんでした。ということは 画像の容量が問題であることがわかります。ちなみにDBの型はmediumblob です。少し余裕があるくらい。型が原因でないことは明白です。

検索してみると、php.iniのメモリサイズの上限やpostできる容量を増やす設定 を修正すれば良い、との情報が。そこで少々いじってみたのですが、 どうも上手くいかない・・・。
そこでもう少し調べてみると、Qiitaでこのような記事を見つけました。

http://qiita.com/wonda/items/e8054c98a7447b2ff8a2

テーブルのROW_FORMATがCOMPACTになっているから DYNAMICにしてあげなきゃいけないようですね。(実はここらへんが よくわかっていないので、あとで調べなきゃいけない、と思っているところです)

my.iniを修正

windows8にxamppで環境を構築しています。

php.iniではなくMySQLの設定ファイル、xampp/mysql/bin/my.iniを修正します。

まず、[mysqld]の下に

を追加します。

次に、

  • max_allowed_packet = 1M

を任意の数値に変更します。僕は余裕をもって16Mとし、 プログラム側で4MB以上を弾く仕様にしましたが、実際は 8MBくらいで良いと思います。

最後に、

の数値部分を変更します。僕は1番目を500Mに、 2番目を800Mにしましたが、そこは臨機応変に。

どうやら原因は転送時の容量オーバだったようです。

まだエラーが出る?

可能性としては次の3つが考えられます。

  1. テーブルの照合順序がutf8mb4_general_ciまたは utf8_general_ciになっていない

  2. 1つのテーブルにカラムを入れすぎている

  3. apacheMySQLを再起動していない

もっと詳しい情報がほしい方はこちらへ
https://yakst.com/ja/posts/2750