"UTF8" को एन्कोडिंग के लिए अमान्य बाइट अनुक्रम


125

मैं अपने डेटाबेस में कुछ डेटा आयात करने की कोशिश कर रहा हूं । इसलिए मैंने एक अस्थायी तालिका बनाई है,

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

और अब मैं डेटा आयात करने की कोशिश कर रहा हूं ,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

लेकिन तब मुझे त्रुटि मिलती है,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

मुझसे इसका समाधान किस प्रकार होगा? क्या मुझे अपने पूरे डेटाबेस की एन्कोडिंग को बदलने की आवश्यकता है (यदि हां, तो कैसे?) या क्या मैं अपनी tmpतालिका के एन्कोडिंग को बदल सकता हूं ? या मुझे फ़ाइल की एन्कोडिंग को बदलने का प्रयास करना चाहिए?


आयात पर एन्कोडिंग विकल्प बदलें। मैंने "Windows-1251" पर सेट किया और यह बिना किसी शिकायत के काम किया।
ब्रायन डी

1
धन्यवाद @BrianD, मैं भी इस मुद्दे का सामना कर रहा था और इसने मेरे लिए काम किया।
gouravkr

जवाबों:


110

यदि आपको अपने डेटाबेस में UTF8 डेटा संग्रहीत करने की आवश्यकता है, तो आपको एक डेटाबेस की आवश्यकता होती है जो UTF8 स्वीकार करता है। आप pgAdmin में अपने डेटाबेस के एन्कोडिंग की जांच कर सकते हैं। बस डेटाबेस पर राइट-क्लिक करें, और "गुण" चुनें।

लेकिन यह त्रुटि आपको बता रही है कि आपकी स्रोत फ़ाइल में कुछ अमान्य UTF8 डेटा है। इसका मतलब है कि copyउपयोगिता ने पता लगाया है या अनुमान लगाया है कि आप इसे UTF8 फ़ाइल खिला रहे हैं।

यदि आप यूनिक्स के कुछ संस्करण के तहत चल रहे हैं, तो आप fileउपयोगिता के साथ एन्कोडिंग (अधिक या कम) की जांच कर सकते हैं ।

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(मुझे लगता है कि टर्मिनल में एमएसीएस पर भी काम करेगा।) यह सुनिश्चित नहीं है कि विंडोज के तहत कैसे करना है।

यदि आप Windows सिस्टम से आई किसी फ़ाइल पर उसी उपयोगिता का उपयोग करते हैं (अर्थात, ऐसी फ़ाइल जो UTF8 में एन्कोड नहीं की गई है), तो यह संभवतः कुछ इस तरह दिखाएगी:

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

यदि चीजें अजीब रहती हैं, तो आप अपने इनपुट डेटा को एक ज्ञात एन्कोडिंग में बदलने की कोशिश कर सकते हैं, अपने क्लाइंट की एन्कोडिंग को बदलने के लिए, या दोनों। (हम वास्तव में एन्कोडिंग के बारे में अपने ज्ञान की सीमाओं को बढ़ा रहे हैं।)

आप iconvइनपुट डेटा के एन्कोडिंग को बदलने के लिए उपयोगिता का उपयोग कर सकते हैं ।

iconv -f original_charset -t utf-8 originalfile > newfile

आप चरित्र सेट समर्थन पर निर्देशों का पालन करके psql (क्लाइंट) एन्कोडिंग को बदल सकते हैं । उस पृष्ठ पर, "स्वचालित वर्ण सेट रूपांतरण सक्षम करने के लिए" वाक्यांश के लिए खोजें।


3
फ़ाइल को ASCII कहते हैं, लेकिन इसमें उच्चारण वर्ण हैं, इसलिए यह गलत होना चाहिए?
21

2
इस उत्तर को स्वीकार करेंगे, लेकिन मुझे लगता है कि समस्या वास्तव में डेटा (अपडेटेड क्यू) के साथ थी।
एमपी

1
मुझे यह मददगार लगा, धन्यवाद। वैसे, यह ओएस एक्स टर्मिनलों पर भी चलता है
राउल रेने

1
यह मेरे लिए काम करता है, लेकिन थोड़ा अलग तरीके से। "आइकनव" कमांड वास्तव में मेरी फाइल पर बमबारी करता है, लेकिन इसने वहीं किया जहां समस्या थी - कुछ अजीब तरह के "-" चरित्र। वैसे भी, मैंने वह हटा दिया, और मेरी फ़ाइल पोस्टग्रेज में लोड करने में सक्षम थी। पारितोषिक के लिए धन्यवाद!
ट्रिप ० डी

1
बस दूसरों और खोज इंजनों की मदद करने के लिए: यह UTF-8 में अपठनीय वर्णों के साथ धारी CSV निर्यात को परिवर्तित करने के लिए काम करता है: `iconv -f ISO-8859-15 -t utf-8 customers.csv> customers-utf8.csv`
sscarduzio

57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

encodingविकल्प जोड़ने से मेरे मामले में काम हुआ।


1
यह त्रुटि के बिना पूरा होगा, यह उपयोगी परिणाम दे भी सकता है और नहीं भी। आपको डेटा के इच्छित एन्कोडिंग को जानना होगा।
जैसन

1
मेरे परिदृश्य में उपरोक्त क्वेरी ने कैसे काम किया? मेरे पास csv फ़ाइल है जो UTF8 और DB के साथ कूटबद्ध है और UTF8 के साथ कूटबद्ध है।
अजय तकुर

14

जाहिर है मैं सिर्फ मक्खी पर एन्कोडिंग सेट कर सकता हूं ,

 set client_encoding to 'latin1'

और फिर क्वेरी को फिर से चलाएँ। मुझे यकीन नहीं है कि मैं किस एन्कोडिंग का उपयोग कर रहा हूं।


latin1पात्रों को सुपाठ्य बनाया, लेकिन अधिकांश उच्चारण पात्र ऊपरी-मामले में थे, जहाँ उन्हें नहीं होना चाहिए था। मैंने मान लिया कि यह खराब एन्कोडिंग के कारण था, लेकिन मुझे लगता है कि इसका वास्तव में डेटा जो अभी खराब था। मैंने लैटिन 1 एन्कोडिंग को रखते हुए समाप्त कर दिया, लेकिन डेटा को पूर्व-प्रसंस्करण और आवरण मुद्दों को निर्धारित किया।


दिलचस्प है, मुझे एक चयन कथन पर त्रुटि मिली! इसने इसे हल किया क्योंकि यह मेरा psql क्लाइंट था जो त्रुटि दे रहा था, न कि केवल डेटाबेस। (जो पहली बार में डेटा को खारिज कर दिया होता, एन्कोडिंग ने इसे निषिद्ध कर दिया था।)
वाइल्डकार्ड

14

यदि आप गैर-परिवर्तनीय वर्णों को छोड़ने के साथ ठीक हैं, तो आप -cध्वज का उपयोग कर सकते हैं

iconv -c -t utf8 filename.csv > filename.utf8.csv

और फिर उन्हें अपनी मेज पर कॉपी करें


मैक पर यह iconv -c -t UTF-8 filename.csv > filename.utf8.csvमेरे लिए था
माइकल

8

इस त्रुटि का अर्थ है कि कनेक्शन के संबंध में फ़ाइल में एन्कोडिंग अलग है। इस मामले में iconv त्रुटि वापस कर सकता है, कभी-कभी // IGNORE ध्वज के बावजूद भी:

iconv -f ASCII -t utf-8 // IGNORE <b.txt> /a.txt

iconv: अवैध इनपुट अनुक्रम स्थिति में (कुछ संख्या)

चाल गलत पात्रों को खोजने और इसे बदलने के लिए है। लिनक्स पर इसे करने के लिए "vim" संपादक का उपयोग करें:

vim (आपकी पाठ फ़ाइल), "ESC": बटन दबाएं और ": goto (आइकनव द्वारा लौटाया गया नंबर)"

गैर ASCII वर्ण खोजने के लिए आप निम्नलिखित कमांड का उपयोग कर सकते हैं:

grep - रंग = 'ऑटो' -P "[\ x80- \ xFF]"

यदि आप गलत वर्णों को हटाते हैं, तो कृपया जांचें कि क्या आपको वास्तव में अपनी फ़ाइल को रूपांतरित करने की आवश्यकता है: शायद समस्या पहले से ही हल है।


iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
जैसन

5

pgadmin में इस समस्या को हल करने के लिए निम्न चरणों का पालन करें:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;


4

यह इस बात पर निर्भर करता है कि आपकी आयात फ़ाइल किस प्रकार की मशीन / एन्कोडिंग से उत्पन्न हुई है।

यदि आप इसे विंडोज के एक अंग्रेजी या पश्चिमी यूरोपीय संस्करण से प्राप्त कर रहे हैं, तो आपका सर्वश्रेष्ठ दांव शायद इसे 'WIN1252' पर सेट कर रहा है। यदि आप इसे किसी अन्य स्रोत से प्राप्त कर रहे हैं, तो यहां चरित्र एन्कोडिंग की सूची देखें:

http://www.postgresql.org/docs/8.3/static/multibyte.html

यदि आप इसे एक मैक से प्राप्त कर रहे हैं, तो आपको इसे मैक आइकन से यूटीएफ -8 में परिवर्तित करने के लिए पहले "आइकनव" उपयोगिता के माध्यम से चलाना पड़ सकता है।


4

वैसे मैं भी इसी समस्या का सामना कर रहा था। और मेरी समस्या का हल क्या है:

एक्सेल में Save as पर क्लिक करें। प्रकार के रूप में सहेजें से, चुनें .csv टूल पर क्लिक करें । फिर ड्रॉप डाउन सूची से वेब विकल्प चुनें । एन्कोडिंग टैब के तहत , दस्तावेज़ को यूनिकोड (UTF-8) के रूप में सहेजें । ओके पर क्लिक करें। फ़ाइल सहेजें। किया हुआ !


3

मुझे भी यही समस्या थी, और यहाँ एक अच्छा समाधान मिला: http://blog.e-shell.org/134

यह आपके डेटाबेस एन्कोडिंग में एक बेमेल के कारण होता है, निश्चित रूप से क्योंकि जिस डेटाबेस से आपको एसक्यूएल डंप मिला है, उसे SQL_ASCII के रूप में एन्कोड किया गया था जबकि नए को UTF8 के रूप में एनकोड किया गया था। .. Recode GNU प्रोजेक्ट का एक छोटा सा टूल है जो आपको किसी दिए गए फ़ाइल के एन्कोडिंग को बदलने देता है।

इसलिए मैंने इसे वापस खेलने से पहले डंपफाइल को फिर से दबाया:

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

डेबियन या उबंटू सिस्टम में, पैकेज के माध्यम से रिकोड स्थापित किया जा सकता है।


2

आप बैकस्लैश चरित्र को प्रतिस्थापित कर सकते हैं, उदाहरण के लिए एक पाइप चरित्र, सेड के साथ।

sed -i -- 's/\\/|/g' filename.txt

2
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

आप UTF8 एन्कोडिंग को संभालने के लिए इसे आज़मा सकते हैं।


2

PHP में इस समस्या को हल करने के लिए लघु उदाहरण-

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

त्रुटि विवरण: चूंकि POSTGRES डेटाबेस UTF-8 वर्णों के अलावा अन्य को संभालता नहीं है, जब हम दिए गए इनपुटों को एक कॉलम में पारित करने की कोशिश करते हैं, जो "UTF8": 0xab "को एन्कोडिंग करने के लिए" अमान्य बाइट अनुक्रम की त्रुटि देता है।

तो बस POSTGRES डेटाबेस में डालने से पहले उस मान को UTF-8 में बदल दें।


2

मुझे एक ही समस्या थी: मेरी फ़ाइल UTF-8 के रूप में एन्कोडेड नहीं थी। मैंने नोटपैड ++ के साथ फ़ाइल को खोलकर और फ़ाइल के एन्कोडिंग को बदलकर इसे हल किया है।

"एन्कोडिंग" पर जाएं और "कन्वर्ट यूटीएफ -8 में" चुनें। परिवर्तन सहेजें और यह सब!


1

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


1

अजगर के लिए, आपको उपयोग करने की आवश्यकता है

क्लास pg8000.types.Bytea (str) बाइटिया एक स्ट्रैट-डिराइव्ड क्लास है जिसे पोस्टग्रेसीक्यू बाइट सरणी में मैप किया जाता है।

या

Pg8000.Binary (मान) बाइनरी डेटा रखने वाली एक वस्तु का निर्माण करता है।


1

मैं विशेष रूप से psql (कोई चित्रमय उपकरण) के साथ काम करते समय विंडोज के तहत इस समस्या में भाग गया। इस समस्या को ठीक करने के लिए, PostgreSQL सर्वर के डिफ़ॉल्ट एन्कोडिंग से मिलान करने के लिए psql (क्लाइंट) के डिफ़ॉल्ट एन्कोडिंग को स्थायी रूप से बदलें। CMD या पॉवर्सशेल में निम्न कमांड चलाएँ:

setx PGCLIENTENCODING UTF8

बंद करें और फिर से खोलें, ताकि आप प्रभावी होने के लिए प्रॉम्प्ट / पॉवर्स को कमांड कर सकें।

यूनीकोड ​​से यूटीएफ 8 में बैकअप फ़ाइल की एन्कोडिंग को नोटपैड के साथ बदलकर और फ़ाइल -> सेव अस में जाकर बदलें। यूनिकोड से UTF8 तक एन्कोडिंग ड्रॉपडाउन को बदलें। (अपनी फ़ाइल के नाम में .txt एक्सटेंशन को जोड़ने से बचने के लिए टेक्स्ट डॉक्युमेंट्स (.txt) से सेव को भी सभी फाइलों में बदलें। अब आपको अपने बैकअप को पुनर्स्थापित करने में सक्षम होना चाहिए।


0

यह इस त्रुटि के साथ भी संभव है कि फ़ील्ड को जगह में एन्क्रिप्ट किया गया है। सुनिश्चित करें कि आप सही तालिका देख रहे हैं, कुछ मामलों में प्रशासक एक अनएन्क्रिप्टेड दृश्य बनाएंगे जिसका उपयोग आप कर सकते हैं। मैंने हाल ही में एक समान मुद्दे का सामना किया।


0

मुझे वही त्रुटि मिली जब मैं एक्सेल द्वारा पोस्टग्रेज टेबल (एक मैक पर सभी) में उत्पन्न सीएसवी को कॉपी करने की कोशिश कर रहा था। यह मैंने इसे हल किया है:

1) एटम में फ़ाइल खोलें (आईडीई जो मैं उपयोग करता हूं)

2) फ़ाइल में एक महत्वहीन परिवर्तन करें। फ़ाइल सहेजें। परिवर्तन पूर्ववत करें। फिर से बचाओ।

Presto! कॉपी कमांड ने अब काम किया।

(मुझे लगता है कि एटम ने इसे एक प्रारूप में सहेजा है जो काम करता है)


0

नोटपैड ++ द्वारा CSV फ़ाइल खोलें। मेनू चुनें Encoding\ Encoding in UTF-8, तो कुछ सेल manuallly ठीक।

फिर आयात का प्रयास करें।


0

यदि आपका CSV SQL सर्वर से निर्यात होने जा रहा है, तो यह बहुत बड़ा है, और इसमें यूनिकोड वर्ण हैं, आप इसे एन्कोडिंग सेट करके निर्यात कर सकते हैं UTF-8:

Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...

अगले पृष्ठ में यह पूछता है कि क्या आप किसी तालिका से डेटा कॉपी करना चाहते हैं या आप एक प्रश्न लिखना चाहते हैं। यदि आपके पास charया varcharतालिका में डेटा प्रकार हैं, तो क्वेरी विकल्प का चयन करें और उन कॉलमों को इस प्रकार डालें nvarchar(max)। उदाहरण के लिए, यदि myTableदो कॉलम हैं, जहां पहला एक है varcharऔर दूसरा एक है int, तो मैंने पहले एक को डाला nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.