2009-08-28 34 views
43

データをmysqlからpostgresに挿入すると、次のエラーが発生します。挿入時のPostgresエラー - エラー:エンコーディング "UTF8"の無効なバイトシーケンス:0x00

入力データからすべてのヌル文字を手動で削除する必要がありますか? postgresに私のためにこれをさせる方法はありますか? PostgreSQLはNULLを格納サポートしていません

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

答えて

39

(\ $ 00)テキストフィールド内の文字(これは完全にサポートされているデータベースのNULL値、とは明らかに異なっています)。

出典: - あなたが欲しいものを保存する必要がありますが、それにテキスト操作をサポートしていません。あなたはNULL文字を格納する必要がある場合http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE

、あなたはbytea型のフィールドを使用する必要があります。

PostgreSQLがテキスト値でそれをサポートしていないとすれば、それを削除する良い方法はありません。データをbyteaにインポートし、後で特別な関数(perlなど)を使ってテキストに変換することもできますが、読み込む前に前処理で行う方が簡単です。

+0

例: は '表store_bytesを作成する( キーINTEGER NULL NOT 、 data bytea NOT NULL ); ' – zengr

1

あなたが最初のBLOBフィールドにデータを挿入し、その後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でNULLバイト:

s/\x00//g; 
+1

は空の文字列で、nullバイトと見なされますか? 'replaceAll(" s/\ x00 // g "、" ")'は他のnullに置き換えられませんか? –

+2

空の文字列はnullバイトと見なされません。ヌルのバイト値は実際の文字ですが、目に見えません。 –

4

Javaを使用している場合は、次のように挿入前に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'.

関連する問題