備忘録 SQL

MYSQL BLOB登録

2010年12月26日

MYSQLのテーブルの型にBLOBを作ることができます。

PHPからMYSQLのBLOBにINSERTする方法は以下の方法から実行は可能です。

insert into TEST (TITLE,FILEDATA) values( 'タイトル名','".mysql_real_escape_string(file_get_contents(ファイルパス))."');

TITLEはVARCHAR、FILEDATAはBLOBと仮定です。
mysql_real_escape_string(file_get_contents(ファイルパス))はPHPの言語です。

しかし、これで実行する場合、ファイルの容量以上にメモリを消費するので、PHPの設定もしくは物理メモリがファイル転送できる上限となりそうです。(700MBで3GB近くのメモリ消費するんだったかな……)

なので、容量が大きい場合はFILE権限を使ってデータを入れたほうがいいと思います。

まず、FILE権限をMYSQLユーザーに付与します。

GRANT FILE ON * . * TO 'ユーザー名'@'ホスト'

FILE権限はグローバル権限になりますので注意してください。(理由は後述)

付与した後は最初に記述したSQLを少し変えるだけ

insert into TEST (TITLE,FILEDATA) values( '".$title."','load_file(ファイルパス)');

'".mysql_real_escape_string(file_get_contents(ファイルパス))."'が'load_file(ファイルパス)に置き換わっただけです。

これで物理メモリを見に行かずにHDD⇔DBのファイルの読み書きができます。こちらのほうが処理的にも早いです。

しかし、FILE権限はMYSQLユーザーで見に行けるとこすべてが見に行けるのでセキュリティ的には危険な権限でもあります。
特にMYSQLをROOT権限で動かしていたらすべてのデータのアクセス、変更が可能になるので注意がいります。
(このフォルダ内のデータを読み書きする権限とかあればいいのになぁ…)
なので、FILE権限を付与する際は慎重に。

-備忘録, SQL
-, , ,