代码之家  ›  专栏  ›  技术社区  ›  ScArcher2

插入时Postgres错误-错误:编码“UTF8”的字节序列无效:0x00

  •  56
  • ScArcher2  · 技术社区  · 15 年前

    我在将mysql中的数据插入postgres时遇到以下错误。

    ERROR: invalid byte sequence for encoding "UTF8": 0x00
    
    6 回复  |  直到 15 年前
        1
  •  72
  •   Martin Velez    12 年前

    PostgreSQL不支持在文本字段中存储NULL(\0x00)字符(这显然不同于完全支持的数据库NULL值)。

    资料来源: http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE

    由于PostgreSQL在文本值中不支持它,所以没有好的方法让它删除它。您可以将数据导入bytea,然后使用一个特殊的函数将其转换为文本(在perl或其他语言中,可能是?),但在加载数据之前进行预处理可能会更容易。

        2
  •  21
  •   hicham    12 年前

    只需正则表达式输出空字节:

    s/\x00//g;
    
        3
  •  18
  •   David Dal Busco    7 年前

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

    Csaba在以下帖子中提供并解释了解决方案:

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

    分别为:

    这是有效的unicode。这被翻译成了中的字符0x0 UTF8,由于服务器使用null,因此不接受UTF8 终止字符串。。。所以唯一的办法就是确保你的字符串 不包含字符“\u0000”。

        4
  •  2
  •   techkuz    6 年前

    只有这个正则表达式对我有效:

    sed 's/\\0//g'
    

    因此,在获取数据时,请执行以下操作: $ get_data | sed 's/\\0//g' 它将输出您的数据,而无需 0x00

        5
  •  1
  •   Hambone    8 年前

    您可以先将数据插入blob字段,然后使用以下函数复制到文本字段

    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();
    
        6
  •  0
  •   Ismail Yavuz    6 年前

    插入前:

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

    选择后:

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

    我已经使用“null”作为我的一些特殊文本,我确信在我的值中不会有任何“null”字符串。

        7
  •  0
  •   Steve Chavez    5 年前

    COPY 以及具有包含空值的转义字符串( 00 )例如:

    "H\x00\x00\x00tj\xA8\x9E#D\x98+\xCA\xF0\xA7\xBBl\xC5\x19\xD7\x8D\xB6\x18\xEDJ\x1En"

    如果你使用 COPY format 'CSV' format 'text' . 这与反睫毛有不同的交互作用,请参见 text format

    如果你正在使用 复制 file_fdw 确保指定 格式为“CSV” 以避免此类错误。