search
LoginSignup
8

More than 5 years have passed since last update.

posted at

updated at

MySQL 大容量画像データが挿入、表示できない。対処方法(PHP逆引きレシピより)wondaの備忘録

画像の表示はデータベースのほうが管理しやすいとのことで、
SHOEISHAのPHP逆引きレシピ266「イメージデータを格納したい」をサンプルとして試した。

:scream_cat: 4MBで設定しているはずがデータベースに挿入できるのはせいぜい300KBまで。これはどうしたということで調べましたが、何箇所かいじらねばならない箇所があったため備忘録として残しておきます。

初期設定では上記のようにファイル容量が上がるとエラーが起こるかと思います。

エラーメッセージ
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help.

:key: このように出たらテーブルのROW_FORMATをDYNAMICに変更します。xampp/mysql/bin/my.iniを開き

The MySQL server

[mysqld]
の下に以下の3行を追加
こうしないとそもそもCOMPACTからDYNAMICに切り替えられません。

innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
さらに
max_allowed_packet = 1M
ここを
max_allowed_packet = 8M に変更。

MySQLを再起動しテーブルの設定を変更
phpMyAdminではテーブルに入り「操作」のテーブルオプションから切り替え可能です。照合順序はutf8mb4_general_ciに設定します。

utf8mb4は文字コードの一種で、UTF8で4バイト文字を扱う事が出来るものらしいです。まあ、大容量を扱う場合はこちらを使うということでしょうか。ROW-FORMATをDYNAMICへ。

これで、ほっとしてたのですが、エラーが消えません!

実はもう1つ変更しなければならない箇所があります。
再びxampp/mysql/bin/my.iniへ。

:key: 今度は
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M

innodb_log_file_size = 500M
innodb_log_buffer_size = 800M
などと変更します。

大容量画像の挿入が失敗する原因は
ここの設定にありました。転送時に容量オーバーを
起こすようです。

以上、設定の変更が完了したら
MySQLを再起動してプログラムを試してみてください。
見事に大きなファイルサイズの画像が表示されるはずです。

表示は最初縮小画像(サムネイル)になっておりますので
クリックすると実際のサイズで表示されます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8