जब UTF8 में स्रोत डेटाबेस को इनकोड किया जाता है, तो एक पुनर्स्थापना पर UTF8 अमान्य बाइट अनुक्रम कॉपी त्रुटियों को कैसे हल किया जाए?


17

मुझे PostgreSQL 8.2.x डेटाबेस को किसी अन्य सर्वर पर स्थानांतरित करने के लिए कार्य दिया गया था। ऐसा करने के लिए मैं pgAdmin 1.12.2 का उपयोग कर रहा हूं (जिस तरह से Ubuntu 11.04 पर) और बैकअप और पुनर्स्थापना का उपयोग करके कस्टम / संपीड़ित प्रारूप (.backup) और UTF8 एन्कोडिंग का उपयोग कर रहा हूं।

मूल डेटाबेस UTF8 में है, जैसे:

-- Database: favela

-- DROP DATABASE favela;

CREATE DATABASE favela
  WITH OWNER = favela
       ENCODING = 'UTF8'
       TABLESPACE = favela
       CONNECTION LIMIT = -1;

मैं इस डेटाबेस को बिल्कुल गंतव्य सर्वर पर इस तरह बना रहा हूं। लेकिन जब मैं पुनर्स्थापना विकल्प का उपयोग करके डेटाबेस को .backup फ़ाइल से पुनर्स्थापित करता हूं तो यह मुझे इनमें से कुछ त्रुटियां देता है:

pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a709
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT:  COPY arena, line 62

जब मैं यह जांचता हूं कि किस रिकॉर्ड ने इस त्रुटि को ट्रिगर किया है तो वास्तव में कुछ वार्टेक्ट फ़ील्ड में ç (जैसे पुर्तगाली में उपयोग किए जाने वाले चरित्र वर्णक होते हैं, उदाहरण के लिए, "caça"), और जब मैं मैन्युअल रूप से उन्हें पाठ से हटाता हूं, तो रिकॉर्ड अगले रिकॉर्ड में पास हो जाता है उनके पास है - क्योंकि जब कॉपी में त्रुटि होती है तो वह इस टेबल पर डेटा डालना बंद कर देता है। और मैं इसे पूरा करने के लिए एक-एक करके उन्हें मैन्युअल रूप से बदलना नहीं चाहता।

लेकिन यह अजीब है क्योंकि UTF8 के साथ इस तरह की समस्याएं नहीं होनी चाहिए, है ना?

मुझे नहीं पता कि वे पहली जगह में वहां कैसे पहुंचे। मैं केवल डेटाबेस को माइग्रेट कर रहा हूं, और मुझे लगता है कि किसी तरह डेटाबेस LATIN1 में था और फिर अनुचित रूप से UTF8 में बदल गया था।

क्या यह जांचने का कोई तरीका है कि क्या तालिका / डेटाबेस में UTF8 अनुक्रम अमान्य हैं? या इन वर्णों को UFT8 में लागू करने / पुन: स्वरूपित करने का कोई तरीका ताकि मैं किसी भी समस्या में भाग न लूं जब मैं पुनर्स्थापना को निष्पादित करूं?

अग्रिम में धन्यवाद।

जवाबों:


8

इंटरनेट के आसपास खुदाई, मैंने देखा है कि यह एक बहुत ही आम समस्या है। सामान्य समाधान एन्कोडिंग को सही करने के लिए प्लेनव के माध्यम से सादे पाठ प्रारूप डंप का उपयोग करना और इसे खिलाना है।

यहाँ इसके बारे में अधिक जानकारी है।


UTF-32 को अमान्य प्रतीकों में परिवर्तित करने के लिए iconv का उपयोग करें और फिर UTF-8, UTF-8 से UTF-8 रूपांतरण पर वापस जाएँ सभी बुरे कोड बिंदुओं को नहीं पकड़ पाएंगे। (जैसे अनाथ सरोगेट्स)
जैसन

7

"मुझे नहीं पता कि वे पहली जगह में वहां कैसे पहुंचे"

यह यहाँ वर्णित के रूप में हो सकता है - हालांकि यह 8.4 पर एक त्रुटि उत्पन्न करता है:

यदि आप किसी भी पाठ प्रकार (जैसे पाठ, varchar (10), आदि) के साथ एक तालिका बनाते हैं, तो आप उस क्षेत्र में अष्ट भाग का उपयोग करके एक अमान्य बाइट अनुक्रम सम्मिलित कर सकते हैं।

उदाहरण के लिए, यदि आपके पास UTF8- एन्कोडेड डेटाबेस है, तो आप कर सकते हैं:

=> रचनात्मक टेबल फू (टी पाठ);

=> INSERT INTO foo VALUES (E '\ 377');

अब, यदि आप तालिका को बाहर कर देते हैं, तो आप परिणामी फ़ाइल को वापस कॉपी नहीं कर सकते। इसका मतलब है कि आपका pg_dump बैकअप पुनर्स्थापित नहीं कर पाएगा। अपने डेटा को वापस पाने का एकमात्र तरीका उस मूल्य को फिर से बचाना है।

सामान्य मुद्दों और उनसे निपटने के कुछ तरीकों के बारे में इस उत्कृष्ट ब्लॉग पर एक अच्छी पोस्ट है


1

आपके यूनिक्स / लिनक्स वातावरण में प्रयुक्त डिफ़ॉल्ट एन्कोडिंग के साथ इसकी संभावना है। वर्तमान में कौन सा एन्कोडिंग डिफ़ॉल्ट है, इसकी जांच करने के लिए, निम्नलिखित को निष्पादित करें:

$ echo $LANG
en_US

इस मामले में, हम स्पष्ट रूप से देख सकते हैं कि यह एक यूटीएफ -8 एन्कोडिंग नहीं है, जिस पर कॉपी कमांड निर्भर करता है।

तो इसे ठीक करने के लिए, हम उदाहरण के लिए LANG चर को निम्नलिखित में सेट करते हैं:

$ export LANG=en_US.UTF-8

नोट: यह केवल वर्तमान सत्र के लिए उपलब्ध होगा। इसे ~ / .bashrc या किसी भी भविष्य के शेल सत्र के स्टार्टअप पर उपलब्ध होने के समान जोड़ें।

संदर्भ


1

मैं सादे पाठ डंप पर आँख बंद करके आइकॉन चलाने की सलाह नहीं देता क्योंकि यह मान्य वर्णों (जैसे: चीनी वर्ण) को कुछ अन्य वर्णों में परिवर्तित कर सकता है। कमांड से नीचे चलाकर अमान्य UTF8 वर्ण ढूंढना बेहतर है।

grep -naxv '.*' plain_text_dump.sql

और फिर विशेष डेटा पर आइकनव चलाएं। विस्तृत विवरण के लिए इस डॉक्टर की जाँच चरणवार करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.