PHP/PDO/MySQL के अनुसार :MEDIUMBLOB में डालने से खराब डेटा स्टोर हो जाता है , अपना पीडीओ ऑब्जेक्ट बनाने के लिए निम्न पंक्ति का उपयोग करने का प्रयास करें:
$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES latin1 COLLATE latin1_general_ci"));
स्पष्टीकरण
मुझे लगता है कि लिंक किए गए प्रश्न में बेन एम नोट के रूप में, यहां काम पर दो खराब डिजाइन निर्णय हैं।
एक कनेक्शन वर्णसेट की यह अवधारणा है। विचार यह है कि SQL पाठ किसी भी वर्णसेट में हो सकता है और फिर SQL सर्वर द्वारा पुनर्प्राप्ति पर परिवर्तित किया जाता है।
यह बाइनरी डेटा के साथ अच्छी तरह से काम नहीं करता है क्योंकि यह टेक्स्ट नहीं है और इस प्रकार, परिभाषा के अनुसार, किसी भी वर्णसेट में नहीं होना चाहिए, लेकिन अभी भी स्ट्रिंग अक्षर का उपयोग करके स्थानांतरित किया जाता है ।
स्थानांतरण के दौरान BLOB डेटा को उद्धृत करके इस समस्या को हल किया जा सकता है (या तो BASE64_* फ़ंक्शन का उपयोग करके या हेक्स-एस्केपिंग ) और, वास्तव में, बहुत से लोग यही कर रहे हैं।
दूसरा डिजाइन निर्णय पीडीओ/पीएचपी में है:पीडीओ कोई वर्णसेट रूपांतरण नहीं करता है (ऐसा नहीं हो सकता है, क्योंकि PHP में तार स्वाभाविक रूप से वर्णसेट-अज्ञेयवादी हैं) इसलिए PHP एकमात्र (या कुछ भाषाओं में से एक) है जहां पसंद है SQL स्थानांतरण वर्णसेट वास्तव में महत्वपूर्ण है क्योंकि इसे उस एन्कोडिंग से मेल खाना चाहिए जो वास्तव में इनपुट स्ट्रिंग्स में है।
अन्य भाषाओं में, स्थानांतरण वर्णसेट को केवल इतना अभिव्यंजक होना चाहिए कि किसी भी वर्ण को शामिल किया जा सके जिसका उपयोग स्ट्रिंग्स में किया जा सकता है। इमोजी की आज की दुनिया में, यह सबसे अधिक संभावना केवल यूनिकोड वर्णसेट (utf-8 और इसी तरह) द्वारा गारंटीकृत है। हालांकि, इनमें से कोई भी बाइनरी-सुरक्षित नहीं है (इसमें बाइट्स का हर संभव संयोजन एक मान्य स्ट्रिंग नहीं देता है) इसलिए भले ही हम PHP समस्या के आसपास काम कर सकें, फिर भी हमें समस्या # 1 के साथ छोड़ दिया जाएगा।
एक आदर्श दुनिया में, स्थानांतरण के दौरान SQL कमांड हमेशा ASCII वर्णसेट में होंगे और प्रत्येक स्ट्रिंग मान में एक वर्णसेट तर्क होगा, जिसमें से "बाइनरी" एक संभावित मान हो सकता है, जो इसके साथ आपूर्ति की जाती है। MySQL में वास्तव में स्ट्रिंग्स के लिए ऐसा निर्माण है, जिसे वह "परिचयकर्ता" कहता है। हालांकि, "_बाइनरी" एक मान्य मान नहीं लगता।
इस वर्णसेट जानकारी का उपयोग दूसरे छोर तक स्ट्रिंग मान को उसके मूल वर्णसेट में बदलने के लिए किया जाएगा (या तो क्लाइंट-टू-सर्वर स्थानान्तरण के लिए कॉलम या सर्वर-से-क्लाइंट स्थानांतरण के लिए प्रोग्रामिंग भाषा का स्ट्रिंग वर्णसेट)।
इस तरह, केवल एक चीज जिसे BLOB मानों से बचना होगा, वह होगी स्ट्रिंग सीमांकक ("
या '
)।