【发布时间】:2011-02-03 05:55:18
【问题描述】:
我听说在将二进制数据(文件等)插入 MySQL 时,您应该使用 bin2hex() 函数并将其作为 HEX 编码值发送,而不是仅在二进制字符串上使用 mysql_real_escape_string 和使用它。
// That you should do
$hex = bin2hex($raw_bin);
$sql = "INSERT INTO `table`(`file`) VALUES (X'{$hex}')";
// Rather than
$bin = mysql_real_escape_string($raw_bin);
$sql = "INSERT INTO `table`(`file`) VALUES ('{$bin}')";
据说是出于性能原因。与 MySQL 如何处理大字符串与它如何处理 HEX 编码值有关
但是,我很难确认这一点。我所有的测试都表明完全相反。 bin2hex 方法的速度慢了约 85%,并使用了约 24% 的内存。
(我正在 PHP 5.3、MySQL 5.1、Win7 x64 上测试这个 - 使用非常简单的插入循环。) em>
例如,此图显示了测试代码运行时 mysqld 进程的私有内存使用情况:
(来源:advefir.com)
有没有人有任何解释或资源可以澄清这一点?
谢谢。
【问题讨论】:
-
使用
"INSERT INTO `table`(`file`) VALUES (X{$hex})";时可能会有不同的性能(从十六进制值中删除引号)? (+1 顺便说一句) -
@Jacco 感谢您的建议。我做了几个测试,这两种方法的执行似乎几乎相同。
X'...'方法似乎在内存和 CPU 使用方面都有一点优势。 - 我将结果一起编辑并上传,如果您有兴趣:atli.advefir.com/images/myisam_joined.png, atli.advefir.com/images/innodb_joined.png -
有趣,我真的很想请一位 DBA 来解释一下这里的“原因”。