読者です 読者をやめる 読者になる 読者になる

WebEngine

web、プログラミング関係について書いていきます。あなたの優しい眼差しがブログの成長につながりますのでどうぞよろしく。

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

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