我聽說有一種傳聞,當把二進制數據(文件等)插入到MySQL中時,應該使用bin2hex()
函數並將其作爲HEX編碼值發送,而不是僅僅使用mysql_real_escape_string
二進制字符串並使用它。爲什麼在將二進制數據從PHP插入MySQL時使用bin2hex?
// 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 - 使用farily簡單的插入環)
例如,該圖顯示了的mysqld進程的私有內存使用,同時測試代碼正在運行:
Private Bytes used by the mysqld process http://atli.advefir.com/images/priv_mem_cropped.gif
有誰知道,澄清這個任何解釋相關或reasources?
謝謝。
有可能當你用'「INSERT INTO \'表\'(\'文件\')VALUES(X {有差別的性能$ hex})「;'(從十六進制值中刪除引號)? (+1 btw) – Jacco 2010-04-02 10:47:33
@Jacco感謝您的建議。我做了一些測試,兩種方法看起來幾乎完全相同。儘管'X'...''方法在內存和CPU使用率方面似乎都略有優勢。 - 我一起編輯了結果並上傳了它們,以防你感興趣:http://atli.advefir.com/images/myisam_joined.png,http://atli.advefir.com/images/innodb_joined.png – Atli 2010-04-02 15:01:07
有趣的,我真的很想讓DBA在這裏解釋'爲什麼'。 – Jacco 2010-04-02 16:04:45