यह पता चला है कि समस्या बल्कि अजीब है। संक्षेप में, MySQL string datatypes MySQL के इंटरफ़ेस में एक अतिरिक्त BINARY ध्वज के साथ एकल डेटाटाइप पर मैप करें।
इस प्रकार, MySQL का VARCHAR
, VARBINARY
, और समान MySQLdb.constants.FIELD_TYPE.VAR_STRING
के लिए एक स्ट्रिंग शाब्दिक मानचित्र कॉलम प्रकार परिभाषाओं में टाइप करें, लेकिन एक अतिरिक्त MySQLdb.constants.FLAG.BINARY
फ्लैग करें जब टाइप VARBINARY
. हो या एक स्ट्रिंग एक *_bin
. से मेल खाती है मिलान।
हालांकि एक MySQLdb.constants.FIELD_TYPE.VARCHAR
है प्रकार, मैं यह पता लगाने में विफल रहा कि इसका उपयोग कब किया जाता है। जैसा कि मैंने कहा, MySQL VARCHAR
कॉलम FIELD_TYPE.VAR_STRING
. पर मैप करता है ।
यदि आपका एप्लिकेशन सच्चे बाइनरी स्ट्रिंग्स का उपयोग करता है (उदाहरण के लिए, आप छवियों को संग्रहीत करते हैं और उन्हें टेक्स्ट के समान कनेक्शन के साथ लाते हैं), तो समाधान नाजुक हो जाता है, क्योंकि यह सभी बाइनरी स्ट्रिंग्स को यूनिकोड में डिकोड करता है। हालांकि, यह काम करता है।
आधिकारिक docs के रूप में राज्य:
व्यवहार में, गधे में वास्तविक दर्द आपके स्वयं के कन्वर्टर्स डिक्शनरी के निर्माण की प्रक्रिया हो सकती है। लेकिन आप डिफ़ॉल्ट को MySQLdb.converters.conversions
. से आयात कर सकते हैं और इसे पैच करें, या इसे कनेक्शन के उदाहरण पर पैच भी करें। ट्रिक यह है कि FLAG.BINARY
. के लिए एक विशेष कनवर्टर को हटा दिया जाए ध्वजांकित करें और सभी मामलों के लिए एक डिकोडर जोड़ें। यदि आप स्पष्ट रूप से charset
specify निर्दिष्ट करते हैं MySQLdb.connect
के लिए पैरामीटर , यह use_unicode=1
. को बाध्य करता है पैरामीटर, जो आपके लिए डिकोडर जोड़ता है, लेकिन आप इसे स्वयं कर सकते हैं:
>>> con = MySQLdb.connect(**params)
>>> con.converter[FIELD_TYPE.VAR_STRING]
[(128, <type 'str'>), (None, <function string_decoder at 0x01FFA130>)]
>>> con.converter[FIELD_TYPE.VAR_STRING] = [(None, con.string_decoder)]
>>> c = con.cursor()
>>> c.execute("SELECT %s COLLATE utf8_bin", u'м')
1L
>>> c.fetchone()
(u'\u043c',)
संभवतः आपको FIELD_TYPE.STRING
. के लिए भी यही हैक करने की आवश्यकता हो सकती है यदि आवश्यक हो।
एक अन्य उपाय स्पष्ट use_unicode=0
. पास करना है करने के लिए MySQLdb.connect
और अपने कोड में सभी डिकोडिंग करें, लेकिन मैं नहीं करूंगा।
आशा है, यह किसी के लिए उपयोगी हो सकता है।