我在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倍的空间。
我认为,最好的办法是将它作为十六进制字符串(只有两倍的空间)将以二进制形式存储在数据库中(无开销)。我已经看过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格式而不是二进制格式。我怎样才能达到我想要的行为?
答案 0 :(得分:0)
使用准备好的查询。我将使用PDO风格的语法。
private function writeFile($fid, &$uData = null, $iFileSize = null) {
$stmt = $this->prepare(
"UPDATE " . self::$dbTableNameFat .
" SET data = :data, size = :size WHERE fid = :fid");
$stmt->execute(array( 'data' => $uData,
'size' => $iFileSize,
'fid' => $fid
);
};
PDO文档为here