2012-08-15 14 views
9

मैंSQLAlchemy और UnicodeDecodeError

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128) 

हो रही है जब मैं पाठ एक MySQL डेटाबेस है, जो मैं SQLAlchemy का उपयोग कर रहा हूँ तक पहुँचने से आ रही गुजरती हैं, यह कार्य करने के लिए:

re.compile(ur"<([^>]+)>", flags=re.UNICODE).sub(u" ", s) 

डेटाबेस एनकोडिंग utf है -8 और मैं एसक्यूएलकेमी के create_engine फ़ंक्शन में एन्कोडिंग भी पास कर रहा हूं।

संपादित करें: यह मैं कैसे डेटाबेस से क्वेरी कर रहा हूँ:

doc = session.query(Document).get(doc_id) 
s = doc.title 

सुझाव, मैं s.decode पारित कर दिया ('utf-8') sub करने के लिए। त्रुटि ऊपर गायब हो गया है, लेकिन मैं एक अलग दस्तावेज़ के लिए एक अलग त्रुटि मिलती है:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 449: invalid continuation byte 

डेटाबेस तालिका इस तरह परिभाषित किया गया है:

CREATE TABLE `articles` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    `cdate` datetime DEFAULT NULL, 
    `link` varchar(255) DEFAULT NULL, 
    `content` text, 
    UNIQUE KEY `id` (`id`), 
    UNIQUE KEY `link_idx` (`link`) 
) ENGINE=InnoDB AUTO_INCREMENT=4127834 DEFAULT CHARSET=utf8; 

किसी भी मदद होगी बहुत सराहना

+0

क्या हम कुछ और कोड देख सकते हैं? कहां से आया है? क्या होगा decode ('utf8') 'चीजों को ठीक करें? –

+0

@MartijnPieters s.decode ('utf-8') जोड़कर उस विशेष दस्तावेज़ के लिए त्रुटि को हल करता है, लेकिन यदि मैं डेटाबेस से एक अलग दस्तावेज़ प्राप्त करने का प्रयास करता हूं तो मुझे मिलता है: यूनिकोड डीकोड त्रुटि: 'utf8' कोडेक बाइट 0xeb को डीकोड नहीं कर सकता स्थिति 44 9: अवैध निरंतर बाइट। तो, एक ही त्रुटि, अलग चरित्र। – user1491915

+0

नहीं, यह एक अलग त्रुटि है (एसीआईआई से एक डीकोड, दूसरा यूटीएफ -8 से)। इसका मतलब है कि दूसरा दस्तावेज़ यूटीएफ -8 डेटा * बिल्कुल नहीं है *। यही कारण है कि हम देखना चाहते हैं कि कहां से आता है। –

उत्तर

28

मेरे पास है इस मुद्दे को हल किया। title कॉलम को SQLAlchemy द्वारा str और Unicode के रूप में वापस नहीं किया जा रहा था। मैंने encoding='utf8' को create_engine के तर्क के रूप में जोड़ने का विचार किया, हालांकि इसका ध्यान रखना होगा, इसे करने का सही तरीका यह है कि इसे यूआरआई: mysql://[email protected]/mydatabase?charset=utf8 डेटाबेस में पास करना है।

आपके सभी उत्तरों के लिए धन्यवाद!

+1

के रूप में दिखाता है यह एक लाइफसेवर था! :-) – JesperB

+3

मुझे उपरोक्त के लिए 'अवैध कनेक्शन विकल्प" अक्षरसेट '' =/ –

+0

मिलता है। धन्यवाद दोस्त। –