2009-11-05 14 views
10

के लिए अमान्य बाइट अनुक्रम मैं mysql से postgresql में एक डीबी माइग्रेट कर रहा हूं। MySQL डीबी का डिफ़ॉल्ट संयोजन यूटीएफ 8 है, पोस्टग्रेस यूटीएफ 8 का भी उपयोग कर रहा है, और मैं डेटा को pg_escape_string() के साथ एन्कोड कर रहा हूं। जो भी कारण तथापि के लिए, मैं बुरा एन्कोडिंग के बारे में कुछ अजीब त्रुटियों में चल रहा हूँ:PostgreSQL + PHP + UTF8 = एन्कोडिंग

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

मैं चारों ओर poking इस पता लगाने की कोशिश कर रहा है, और पाया है कि php कुछ अजीब कर रही है; यदि एक स्ट्रिंग में केवल एसीसी वर्ण हैं (उदाहरण के लिए "हैलो"), एन्कोडिंग ASCII है। यदि स्ट्रिंग में कोई गैर असीसी वर्ण शामिल है, तो यह कहता है कि एन्कोडिंग यूटीएफ 8 है (उदाहरण के लिए "हेलो")।

जब मैं पहले से यूटीएफ 8 वाले तारों पर utf8_encode() का उपयोग करता हूं, तो यह विशेष वर्णों को मारता है और उन्हें सब गड़बड़ कर देता है, तो .. यह काम करने के लिए मैं क्या कर सकता हूं?

(सटीक चार यह फांसी ऊपर अभी है "", लेकिन इसके बजाय बस खोज/बदलें का, मैं एक बेहतर समाधान खोजने के लिए तो यह थोड़े समस्या फिर से नहीं होता है चाहते हैं)

उत्तर

1
BTW

, एक एएससीआईआई स्ट्रिंग यूटीएफ -8 में बिल्कुल वही है क्योंकि वे पहले 127 अक्षर साझा करते हैं; इसलिए ASCII में "हैलो" बिल्कुल यूटीएफ -8 में "हैलो" जैसा ही है, इसमें कोई रूपांतरण आवश्यक नहीं है।

तालिका में संयोजन यूटीएफ -8 हो सकता है लेकिन आप उसी एन्कोडिंग में इसकी जानकारी नहीं ले रहे हैं। अब अगर आपको जानकारी के साथ परेशानी है तो आप pg_escape_string पर देते हैं, शायद यह है कि आप मानते हैं कि MySQL से प्राप्त सामग्री को यूटीएफ -8 में एन्कोड किया गया है, जबकि यह नहीं है। मेरा सुझाव है कि आप this page on MySQL documentation देखें और अपने कनेक्शन के एन्कोडिंग देखें; आप शायद एक टेबल से आ रहे हैं जहां संयोजन यूटीएफ -8 है लेकिन आप कनेक्शन लैटिन -1 की तरह कुछ हैं (जहां çéèêöà आदि जैसे विशेष पात्र यूटीएफ -8 में एन्कोड नहीं किए जाएंगे)।

+0

इसके साथ टकराने के कुछ घंटों के बाद, मैं वास्तव में यह सोचना शुरू कर रहा हूं कि MySQL ने डीबी में गैर-utf8 तारों को अनुमति दी है, जो समस्या का कारण बन रहा है .. – Ian

6

सबसे अधिक संभावना है कि आपके MySQL डेटाबेस में डेटा UTF8 नहीं है। यह एक सुंदर आम परिदृश्य है। MySQL कम से कम डेटा पर किसी भी उचित सत्यापन के लिए उपयोग नहीं किया जाता है, इसलिए यूटीएफ 8 के रूप में आपने इसे किसी भी चीज को स्वीकार कर लिया जब तक कि आपके ग्राहक ने दावा किया कि यह यूटीएफ 8 था। उन्होंने तय किया होगा कि अब तक (या नहीं, मुझे नहीं पता कि वे इसे एक समस्या भी मानते हैं), लेकिन आप पहले से ही डीबी में डेटा को ग़लत ढंग से एन्कोड कर चुके हैं। PostgreSQL, निश्चित रूप से, जब आप इसे लोड करते हैं तो पूर्ण सत्यापन करता है, और इस प्रकार यह असफल हो सकता है।

आप किसी ऐसे आइकन के माध्यम से डेटा को फ़ीड करना चाहते हैं जिसे अज्ञात वर्णों को अनदेखा करने के लिए सेट किया जा सकता है, या उन्हें "सर्वश्रेष्ठ अनुमान" में बदल दिया जा सकता है।

+0

बिल्कुल आइकनव! धन्यवाद। –

संबंधित मुद्दे