"UTF8" एन्कोडिंग के लिए कोई NULLs, अभी तक अमान्य बाइट अनुक्रम: 0x00


12

मैंने पिछले 8 घंटे PostgreSQL 8.4.9 में 'mysqldump --compatible = postgresql' के आउटपुट को आयात करने की कोशिश में बिताए हैं, और मैंने इस विशिष्ट समस्या के बारे में कम से कम 20 अलग-अलग सूत्र पढ़े हैं और पहले से ही यहां मौजूद हैं, लेकिन नहीं मिला असली प्रयोग करने योग्य उत्तर जो काम करता है।

MySQL 5.1.52 डेटा डंप किया गया:

mysqldump -u root -p --compatible=postgresql --no-create-info --no-create-db --default-character-set=utf8 --skip-lock-tables rt3 > foo

PostgreSQL 8.4.9 गंतव्य के रूप में सर्वर

'Psql -U rt_user -f foo' के साथ डेटा लोड कर रहा है (इनमें से कई, यहाँ एक उदाहरण है):

psql:foo:29: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
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".

निम्नलिखित के अनुसार, इनपुट फ़ाइल में कोई NULL (0x00) वर्ण नहीं हैं।

database-dumps:rcf-temp1# sed 's/\x0/ /g' < foo > nonulls
database-dumps:rcf-temp1# sum foo nonulls
04730 2545610 foo
04730 2545610 nonulls
database-dumps:rcf-temp1# rm nonulls

इसी तरह, पर्ल के साथ एक और चेक नोल्स दिखाता है:

database-dumps:rcf-temp1# perl -ne '/\000/ and print;' foo
database-dumps:rcf-temp1#

जैसा कि त्रुटि उल्लेख में "HINT" के रूप में, मैंने 'client_encoding' को 'UTF8' में सेट करने के लिए हर संभव कोशिश की है, और मैं सफल हूं लेकिन इसका मेरी समस्या को हल करने की दिशा में कोई प्रभाव नहीं है।

database-dumps:rcf-temp1# psql -U rt_user --variable=client_encoding=utf-8 -c "SHOW client_encoding;" rt3
 client_encoding
-----------------
 UTF8
(1 row)

database-dumps:rcf-temp1#

परिपूर्ण, अभी तक:

database-dumps:rcf-temp1# psql -U rt_user -f foo --variable=client_encoding=utf-8 rt3
...
psql:foo:29: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
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".
...

"हॉयल के अनुसार" सही उत्तर को छोड़कर, जिसे सुनना शानदार होगा, और यह जानकर कि मैं वास्तव में इस दुर्लभ-संदर्भित डेटा के लिए किसी भी गैर-एएससीआईआई पात्रों को संरक्षित करने के बारे में परवाह नहीं करता हूं, आपके पास क्या सुझाव हैं?

अपडेट: मुझे आयात समय में एक ही डंप फ़ाइल के ASCII- केवल संस्करण के साथ एक ही त्रुटि मिलती है। सचमुच मन-मुटाव:

database-dumps:rcf-temp1# # convert any non-ASCII character to a space
database-dumps:rcf-temp1# perl -i.bk -pe 's/[^[:ascii:]]/ /g;' mysql5-dump.sql
database-dumps:rcf-temp1# sum mysql5-dump.sql mysql5-dump.sql.bk
41053 2545611 mysql5-dump.sql
50145 2545611 mysql5-dump.sql.bk
database-dumps:rcf-temp1# cmp mysql5-dump.sql mysql5-dump.sql.bk
mysql5-dump.sql mysql5-dump.sql.bk differ: byte 1304850, line 30
database-dumps:rcf-temp1# # GOOD!
database-dumps:rcf-temp1# psql -U postgres -f mysql5-dump.sql --variable=client_encoding=utf-8 rt3
...
INSERT 0 416
psql:mysql5-dump.sql:30: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 455
INSERT 0 424
INSERT 0 483
INSERT 0 447
INSERT 0 503
psql:mysql5-dump.sql:36: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 502
INSERT 0 507
INSERT 0 318
INSERT 0 284
psql:mysql5-dump.sql:41: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 382
INSERT 0 419
INSERT 0 247
psql:mysql5-dump.sql:45: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 267
INSERT 0 348
^C

विचाराधीन तालिका में से एक के रूप में परिभाषित किया गया है:

                                        Table "public.attachments"
     Column      |            Type             |                        Modifie
-----------------+-----------------------------+--------------------------------
 id              | integer                     | not null default nextval('atta)
 transactionid   | integer                     | not null
 parent          | integer                     | not null default 0
 messageid       | character varying(160)      |
 subject         | character varying(255)      |
 filename        | character varying(255)      |
 contenttype     | character varying(80)       |
 contentencoding | character varying(80)       |
 content         | text                        |
 headers         | text                        |
 creator         | integer                     | not null default 0
 created         | timestamp without time zone |
Indexes:
    "attachments_pkey" PRIMARY KEY, btree (id)
    "attachments1" btree (parent)
    "attachments2" btree (transactionid)
    "attachments3" btree (parent, transactionid)

मेरे पास DB स्कीमा के किसी भी भाग के प्रकार को बदलने की स्वतंत्रता नहीं है। ऐसा करने से संभवतः भविष्य में सॉफ़्टवेयर का अपग्रेड इत्यादि टूट जाएगा ।

संभावित समस्या स्तंभ 'टेक्स्ट' प्रकार की 'सामग्री' है (शायद अन्य तालिकाओं में भी)। जैसा कि मैं पहले से ही पिछले शोध से जानता हूं, PostgreSQL NULL को 'टेक्स्ट' मानों की अनुमति नहीं देगा। हालाँकि, ऊपर देखें कि कहाँ sed और Perl दोनों कोई NULL वर्ण नहीं दिखाते हैं, और फिर नीचे जहाँ मैं पूरी डंप फ़ाइल से सभी गैर-ASCII वर्णों को हटाता हूँ, लेकिन यह अभी भी बारफ़्स है।


2
आपके डंप फ़ाइल की लाइन 29 क्या दिखती है? जैसे कुछ काम का head -29 foo | tail -1 | cat -vहो सकता है।
म्यू बहुत छोटा है

प्रभावित तालिका की परिभाषा क्या है और आक्रामक रेखा क्या दिखती है?
tscho

यह कंपनी के डेटा का ~ 1MB है। मैं समझता हूं कि आप बेशक कहां हैं, हालांकि। यहाँ विचार की उस पंक्ति का अंत है (कृपया जिर
jblaine

tscho: जैसा कि संकेत दिया गया है, कि उदाहरण त्रुटि लाइन इन त्रुटियों के सैकड़ों में से एक है।
jblaine

जवाबों:


3

उन वर्णों / पाठ क्षेत्रों में से एक या अधिक MAY की सामग्री के लिए 0x00 है।

निम्नलिखित का प्रयास करें:

SELECT * FROM rt3 where some_text_field = 0x00 LIMIT 1;

यदि यह कोई एकल पंक्ति देता है, तो उन वर्ण / पाठ फ़ील्ड को अपडेट करने का प्रयास करें:

UPDATE rt3 SET some_text_field = '' WHERE some_text_field = 0x00;

बाद में, एक और MYSQLDUMP ... (और PostgreSQL आयात विधि) आज़माएँ।


इससे मुझे अपने आवारा अशक्त चरित्रों को खोजने में मदद मिली, हालांकि मुझे उपयोग करने की आवश्यकता थी colname LIKE concat('%', 0x00, '%')। उन्हें क्रमबद्ध PHP सरणियों वाले क्षेत्रों में मिला।
cimmanon

5

मुझे MySQL संस्करण 5.0.51 और पोस्टग्रेज संस्करण 9.3.4.0 का उपयोग करने में एक ही समस्या थी। मैंने "UTF8" को एन्कोडिंग के लिए "अमान्य बाइट अनुक्रम: 0x00" हल किया, जिसके बाद डैनियल वेथ्रे की टिप्पणी देखने के बाद कि "mygrqldump in postgresql मोड स्ट्रिंग्स में \ 0 के रूप में नल बाइट्स को डंप करेगा, इसलिए आप संभवतः वर्णों के उस क्रम को खोजना चाहते हैं।"

निश्चित रूप से पर्याप्त grep ने आखिरकार NULL वर्ण का खुलासा किया।

grep \\\\0 dump.sql

मैंने निम्नलिखित कमांड का उपयोग करके NULL वर्णों को बदल दिया

sed -i BAK 's/\\0//g' dump.sql

Postgres तब सफलतापूर्वक dump.sql को लोड करने में सक्षम था


4

आप इस त्रुटि को बिना किसी NULL बाइट या किसी गैर-असिसी वर्ण के बिना फ़ाइल में प्राप्त कर सकते हैं। Utf8 डेटाबेस में उदाहरण:

select E'ab\0cd';

निकलेगा:

त्रुटि: "UTF8" एन्कोडिंग के लिए अमान्य बाइट अनुक्रम: 0x00 HINT: यह त्रुटि तब भी हो सकती है जब बाइट अनुक्रम सर्वर द्वारा अपेक्षित एन्कोडिंग से मेल नहीं खाता है, जिसे "client_encoding" द्वारा नियंत्रित किया जाता है।

mygrqldump in postgresql मोड null बाइट्स को स्ट्रिंग्स में \ 0 के रूप में डंप करेगा, इसलिए आप संभवतः वर्णों के उस क्रम को खोजना चाहते हैं।


0

मुझे इस तरह की एक समस्या याद है। मुझे लगता है कि मैंने स्कीमा को माइग्रेट करना और फिर डेटा को सीएसवी के रूप में डंप करना और सीएसवी फ़ाइल से डेटा लोड करना समाप्त कर दिया। मुझे याद है कि csv फ़ाइल (सीड या यूनिक्सटोड जैसे यूनिक्स टूल्स का उपयोग करके) या ओपन ऑफिस कैल्क (एक्सेल) का उपयोग करके कुछ आइटमों को ठीक करने के लिए आयात चरण में त्रुटियां थीं - यह खोलने और फिर से बचत करने जितना आसान हो सकता है। फ़ाइल।

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