PHP (StreamWrapper) で単純な VFS (仮想ファイル システム) を作成し、そのデータを MySQL データベースに格納しました。データを格納するフィールドは中程度の BLOB です。
たとえば、PHPでできること:
copy( 'mytext.txt', 'dbfs://mytext.txt' );
copy( 'mytext.pdf', 'dbfs://mytext.pdf' ); or visa versa/etc.
問題は、SQL ステートメントを介して渡される pdf などのバイナリ データです。エスケープ、引用符の解除、base64 などは、データを破壊するか、大量のメモリ (オーバーヘッド) を消費します。たとえば、base64 は 3 倍のスペースを占有します。
最善の方法は、データベースにバイナリとして格納される 16 進文字列 (スペースの 2 倍のみ) にすることです (オーバーヘッドなし)。MySQL の HEX コマンドを見てきましたが、思い通りに動作させることができません。
たとえば、次のステートメントは、それをバイナリ データとして BLOB に格納しません。
UPDATE dbfs SET data=0xFF883838<very long string>FFA9999...... WHERE (fid=<number>)
私が作った機能:
private function writeFile( $fid, &$uData = null, $iFileSize = null )
{
$sSql = 'UPDATE '.self::$dbTableNameFat.
' SET data="'.(($uData !== null)?('0x'.bin2hex($uData)):null).'"'.
',size="'.((int)$iFileSize).'" WHERE ( fid="'.$fid.'" );';
return $this->writeQuery( $sSql );
}
BLOB にはデータが含まれていますが、バイナリではなく HEX 形式です。希望する動作を実現するにはどうすればよいですか?