मैंने एक अफवाह सुनाई कि बाईरी डेटा (फाइलें और इस तरह) को MySQL में डालने पर, आपको bin2hex()
फ़ंक्शन का उपयोग करना चाहिए और इसे बाइनरी स्ट्रिंग पर 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 बड़े स्ट्रिंग्स को कैसे प्रबंधित करता है इसके साथ कुछ करने के लिए। यह हेक्स-कोडित मानों को कैसे नियंत्रित करता है
हालांकि, मुझे इसकी पुष्टि करने में कठिनाई हो रही है। मेरे सभी परीक्षण सटीक oposite इंगित करते हैं; कि 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
किसी को भी किसी भी explainations या reasources कि इस स्पष्ट होता है?
धन्यवाद।
वहाँ एक अंतर प्रदर्शन का उपयोग करने पर '" में \ 'तालिका \ INSERT' (\ 'फ़ाइल \') मान (एक्स {हो सकता है $ हेक्स}) ";" (हेक्स वैल्यू को छोड़ने से उद्धरण हटाएं)? (+1 बीटीडब्ल्यू) – Jacco
@Jacco सुझाव के लिए धन्यवाद। मैंने कुछ परीक्षण किए और दो विधियां लगभग समान रूप से प्रदर्शन करने लगती हैं। 'एक्स' ... '' विधि मेमोरी और सीपीयू उपयोग दोनों में मामूली बढ़त प्रतीत होती है। - यदि आप रुचि रखते हैं तो मैंने परिणामों को एक साथ संपादित किया और उन्हें अपलोड किया: http://atli.advefir.com/images/myisam_joined.png, http://atli.advefir.com/images/innodb_joined.png – Atli
दिलचस्प, मैं वास्तव में 'क्यों' व्याख्या करने के लिए एक डीबीए पसंद करूंगा। – Jacco