2009-08-28 10 views
43

मुझे mysql से पोस्टग्रेस में डेटा डालने पर निम्न त्रुटि मिलती है।डालने पर पोस्टग्रेस त्रुटि - त्रुटि: एन्कोडिंग "यूटीएफ 8" के लिए अमान्य बाइट अनुक्रम: 0x00

क्या मुझे अपने इनपुट डेटा से सभी शून्य अक्षर मैन्युअल रूप से निकालना है? क्या मेरे लिए यह करने के लिए पोस्टग्रेस पाने का कोई तरीका है?

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

उत्तर

39

PostgreSQL शून्य भंडारण का समर्थन नहीं करता (\ 0x00) पाठ फ़ील्ड में वर्ण (यह स्पष्ट रूप से डेटाबेस शून्य मूल्य है, जो पूरी तरह से समर्थित है से अलग है)।

स्रोत: http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE

आप शून्य चरित्र स्टोर करने के लिए की जरूरत है, तो आप एक bytea क्षेत्र का उपयोग करना चाहिए - जो भी चाहें संगृहीत करना चाहिए, लेकिन इस पर पाठ के संचालन का समर्थन नहीं करेंगे।

यह देखते हुए कि PostgreSQL पाठ मानों में इसका समर्थन नहीं करता है, इसे हटाने के लिए इसे पाने का कोई अच्छा तरीका नहीं है। आप अपने डेटा को बाइटिया में आयात कर सकते हैं और बाद में इसे किसी विशेष फ़ंक्शन (पेर्ल या कुछ में, हो सकता है?) का उपयोग कर पाठ में रूपांतरित कर सकते हैं, लेकिन इसे लोड करने से पहले प्रीप्रोसेसिंग में ऐसा करना आसान हो जाएगा।

+0

उदाहरण: 'टेबल store_bytes बनाएँ ( कुंजी पूर्णांक नहीं NULL , डेटा बाइटिया न्यूल ); ' – zengr

1

आप पहली बार ब्लॉब क्षेत्र में डेटा सम्मिलित कर सकते हैं और फिर folloing समारोह के साथ पाठ क्षेत्र में प्रतिलिपि

CREATE OR REPLACE FUNCTION blob2text() RETURNS void AS $$ 
Declare 
    ref record; 
    i integer; 
Begin 
    FOR ref IN SELECT id, blob_field FROM table LOOP 

      -- find 0x00 and replace with space  
     i := position(E'\\000'::bytea in ref.blob_field); 
     WHILE i > 0 LOOP 
     ref.bob_field := set_byte(ref.blob_field, i-1, 20); 
     i := position(E'\\000'::bytea in ref.blobl_field); 
     END LOOP 

    UPDATE table SET field = encode(ref.blob_field, 'escape') WHERE id = ref.id; 
    END LOOP; 

End; $$ LANGUAGE plpgsql; 

-

SELECT blob2text(); 
15

बस बाहर regex अशक्त बाइट्स:

s/\x00//g; 
+1

खाली स्ट्रिंग को शून्य बाइट के रूप में माना जाता है? 'सभी को नहीं बदलेगा ("s/\ x00 // g", "")' परिणामस्वरूप उन्हें अन्य नल के साथ बदल दिया जाएगा? –

+2

खाली तारों को शून्य बाइट्स के रूप में नहीं माना जाता है। शून्य बाइट मान वास्तविक वर्ण हैं, लेकिन अदृश्य हैं। –

4

यदि आप जावा का उपयोग कर रहे हैं, तो आप निम्नानुसार डालने से पहले x00 वर्णों को प्रतिस्थापित कर सकते हैं:

myValue.replaceAll("\u0000", "") 

समाधान प्रदान किया गया था और कसाबा से समझाया पद निम्नलिखित में:

https://www.postgresql.org/message-id/1171970019.3101.328.camel%40coppola.muc.ecircle.de

क्रमशः:

in Java you can actually have a "0x0" character in your string, and that's valid unicode. So that's translated to the character 0x0 in UTF8, which in turn is not accepted because the server uses null terminated strings... so the only way is to make sure your strings don't contain the character '\u0000'.

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