揮発性のメモ2

知識をメモ書きしておく

MySQLで、データベースにバイナリデータを保存する

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


このサイズは MariaDBMySQL の 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