0

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

4

1 回答 1

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 文档在这里

于 2013-07-30T14:16:03.473 回答