Blob编码数据库之间的差异

时间:2014-12-29 17:22:56

标签: php mysql sql

我使用两个数据库,一个是典型的WAMP服务器,另一个是本地MySQL数据库。我注意到每个数据库存储blob的方式存在一些差异,我在导出行并比较每个blob时会注意到这一点。

例如,当本地MySQL导出blob时,任何' NUL' ASCII字符以' \'为前缀,但从WAMP MySQL导出时则不是这种情况。所以要匹配它们我必须做(在PHP中用于db导出)

$val = str_replace(chr('NUL'), '\0', $val);

当我通过寻找出口之间的更多差异时,我也必须这样做

$val = str_replace(chr(0x9), chr(0x5c).chr(0x9), $val); 
$val = str_replace(chr(0xa), chr(0x5c).chr(0xa), $val); 

这很好,对于一个非常简单和微小的图像。但我可以想象,我将遇到更多的差异,我无法以理智和及时的方式解释所有这些差异。我想知道这是什么意思。两个表都是InnoDB引擎和utf8_general_ci排序规则。还有什么可能是错误的配置?

1 个答案:

答案 0 :(得分:1)

我假设您有充分的理由不使用mysqldump从数据库转储数据,因为这是执行此操作的最佳方式。

如果要在PHP中使用查询转储blob,则有几个选项。您可以使用SELECT ... INTO DUMPFILE fnameSELECT ... INTO OUTFILE fname,并提供文件名。 MySQL文档建议使用SELECT INTO DUMPFILE专门用于将blob字段写入文件。还可以使用FIELDS ESCAPED BY子句。有关详细信息,请参阅MySQL文档http://dev.mysql.com/doc/refman/5.1/en/select-into.html

如果SELECT ... INTO OUTFILE技术不适合您,您可以尝试从数据库中获取blob数据并使用mysqli_real_escape_string将其转义,然后再将其写入转储文件。这应该足以逃避数据,以便可以将其重新插入数据库。请记住,编码需要在两个表上匹配。