MariaDBで、データベースに画像ファイルを保存する。 是非は問わない。
テーブルの編集
LONGBLOB とかいう型のカラムを追加する
ALTER TABLE photo ADD COLUMN bin LONGBLOB;
BLOBは 64KBまでのバイナリ、LONGBLOBは 4GBまでのバイナリが入る
MariaDB - What's the max blob size? - MariaDB Knowledge Base
なんかBLOBに限っては DEFAULT NULL の方が良いらしい。
根拠がよくわからないので後で調べるが、それを差し置いてもデフォルトで空を指定するのも面倒だしいろいろトラブルになりそうなので 暫定で NULL を許容する
PHPでデータを入れる
とりあえず、MySQLi でプリペアードステートメントを使って入れるには次のようにやる
<? $bin = file_get_contents($filename); $stmt = $mysql->prepare("UPDATE photo SET bin=? WHERE filename=?"); $stmt->bind_param("bs", $bin, $filename); $stmt->send_long_data(0, $bin);
注意点は2つある
bind_param ではデータは入らない
bindしてもデータが入るわけではない。 実際のデータはそのあとの send_long_data() で入る。
よって、ここでの $bin は 単なる位置合わせなので $dummy とか適当なものを割り当てても良い
send_long_dataで入れられるのは16MBまで
16MBを超えるサイズのデータを入れたいときは、細かく刻んで複数回に分けて呼ぶ必要がある
PHP: mysqli_stmt::send_long_data - Manual
このサイズは MariaDBやMySQL の max_allowed_packet に依存するので、これを大きくすることでも回避できる。 昔のMySQLでは初期値が1MBだった。
MariaDB [unko]> SHOW VARIABLES LIKE 'max_allowed_packet'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | max_allowed_packet | 16777216 | +--------------------+----------+
max_allowed_packet — MariaDB Documentation