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