MySQL:如何使用HEX将文件存储到中等blob字段二进制文件中

时间:2013-07-30 13:55:05

标签: php mysql binary hex blob

我在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格式而不是二进制格式。我怎样才能达到我想要的行为?

1 个答案:

答案 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