त्रुटि संदेश
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2026'
in position 35: ordinal not in range(256)
ऐसा लगता है कि कुछ पायथन भाषा कोड वर्ण को बदलने की कोशिश कर रहे हैं \u2026
एक लैटिन-1 (ISO8859-1) स्ट्रिंग में, और यह विफल हो रहा है। आश्चर्य की बात नहीं, वह चरित्र है U+2026 HORIZONTAL ELLIPSIS
, जिसका ISO8859-1 में कोई एक समान वर्ण नहीं है।
आपने ?charset=utf8
. क्वेरी जोड़कर समस्या का समाधान किया आपके SQLAlchemy कनेक्शन कॉल में:
import sqlalchemy
from sqlalchemy import create_engine, MetaData, Table
db = create_engine('mysql://user:[email protected]/db?charset=utf8')
अनुभाग डेटाबेस यूआरएल
SQLAlchemy दस्तावेज़ीकरण हमें बताता है कि mysql
. से शुरू होने वाला URL mysql-python
. का उपयोग करके एक MySQL बोली को इंगित करता है ड्राइवर।
निम्न अनुभाग, कस्टम DBAPI कनेक्ट () तर्क , हमें बताता है कि क्वेरी तर्क अंतर्निहित डीबीएपीआई को पास किए जाते हैं।
तो, mysql-python
क्या करता है
पैरामीटर {charset:'utf8'}
. का ड्राइवर मेक ? अनुभाग कार्य और विशेषताएँ
उनके दस्तावेज़ीकरण वर्णसेट
. के बारे में कहते हैं विशेषता "... यदि मौजूद है, तो कनेक्शन वर्ण सेट को इस वर्ण सेट में बदल दिया जाएगा, यदि वे समान नहीं हैं।"
यह पता लगाने के लिए कि कनेक्शन कैरेक्टर सेट का क्या अर्थ है, हम पर जाते हैं। <मजबूत>10.1.4। कनेक्शन कैरेक्टर सेट और कोलाज MySQL 5.6 संदर्भ पुस्तिका का। एक लंबी कहानी को छोटा करने के लिए, MySQL आने वाली क्वेरी को डेटाबेस के कैरेक्टर सेट से अलग एन्कोडिंग के रूप में व्याख्या कर सकता है, और लौटाए गए क्वेरी परिणामों के एन्कोडिंग से अलग हो सकता है।
चूंकि आपके द्वारा रिपोर्ट किया गया त्रुटि संदेश SQL त्रुटि संदेश के बजाय पायथन जैसा दिखता है, मैं अनुमान लगाऊंगा कि SQLAlchemy या mysql-python में कुछ क्वेरी को latin-1
भेजने से पहले। यही त्रुटि को ट्रिगर करता है। हालांकि, क्वेरी स्ट्रिंग ?charset=utf8
अपने कनेक्ट ()
. में कॉल कनेक्शन की एन्कोडिंग और U+2026 HORIZONTAL ELLIPSIS
को बदल देता है पार करने में सक्षम है।
अपडेट करें: आप यह भी पूछते हैं, "अगर मैं वर्णसेट विकल्प को हटा दूं और फिर .encode('cp1252') का उपयोग करके विवरण को एन्कोड कर दूं तो यह ठीक हो जाएगा। एक इलिप्सिस cp1252 के माध्यम से कैसे प्राप्त कर सकता है लेकिन यूनिकोड नहीं?"
एन्कोडिंग cp1252
है
बाइट मान पर एक क्षैतिज दीर्घवृत्त वर्ण \x85
. इस प्रकार U+2026 HORIZONTAL ELLIPSIS
युक्त यूनिकोड स्ट्रिंग को एन्कोड करना संभव है त्रुटि के बिना cp1252 में।
यह भी याद रखें कि पायथन में, यूनिकोड स्ट्रिंग्स और बाइट स्ट्रिंग्स दो अलग-अलग डेटा प्रकार हैं। यह अनुमान लगाना उचित है कि MySQLdb में SQL कनेक्शन पर केवल बाइट स्ट्रिंग भेजने की नीति हो सकती है। इस प्रकार यह एक यूनिकोड स्ट्रिंग के रूप में प्राप्त क्वेरी को बाइट स्ट्रिंग में एन्कोड करेगा, लेकिन केवल बाइट स्ट्रिंग के रूप में प्राप्त क्वेरी को छोड़ देगा। (यह अटकलें हैं, मैंने स्रोत कोड को नहीं देखा है।)
आपके द्वारा पोस्ट किए गए ट्रेसबैक में, अंतिम दो पंक्तियाँ (जहां त्रुटि होती है, उसके निकटतम) विधि नाम शाब्दिक
दिखाती हैं , उसके बाद unicode_literal
. यह इस सिद्धांत का समर्थन करता है कि MySQLdb एक यूनिकोड स्ट्रिंग के रूप में प्राप्त क्वेरी को बाइट स्ट्रिंग में एन्कोड कर रहा है।
जब आप क्वेरी स्ट्रिंग को स्वयं एन्कोड करते हैं, तो आप MySQLdb के उस हिस्से को बायपास करते हैं जो इस एन्कोडिंग को अलग तरीके से करता है। हालांकि, ध्यान दें कि यदि आप क्वेरी स्ट्रिंग को MySQL कनेक्शन वर्णसेट कॉल की तुलना में अलग तरीके से एन्कोड करते हैं, तो आपके पास एक एन्कोडिंग बेमेल होगा, और आपका टेक्स्ट संभवतः गलत संग्रहीत किया जाएगा।