Подтвердить что ты не робот

Ошибка Postgres при вставке - ОШИБКА: неверная последовательность байтов для кодирования "UTF8": 0x00

Я получаю следующую ошибку при вставке данных из mysql в postgres.

Нужно ли вручную удалять все нулевые символы из моих входных данных? Есть ли способ получить postgres, чтобы сделать это для меня?

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

Ответ 1

PostgreSQL не поддерживает сохранение символов NULL (\ 0x00) в текстовых полях (это явно отличается от значения NULL базы данных, которое полностью поддерживается).

Источник: http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE

Если вам нужно сохранить символ NULL, вы должны использовать поле bytea, которое должно хранить все, что вы хотите, но не поддерживает текстовые операции на нем.

Учитывая, что PostgreSQL не поддерживает его в текстовых значениях, нет хорошего способа его удалить. Вы можете импортировать свои данные в bytea, а затем преобразовать их в текст с помощью специальной функции (в perl или что-то, может быть?), Но, скорее всего, это будет проще сделать при предварительной обработке, прежде чем вы ее загрузите.

Ответ 2

Просто повторно выведите нулевые байты:

s/\x00//g;

Ответ 3

Если вы используете Java, вы можете просто заменить символы x00 перед вставкой, как показано ниже:

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

Решение было предоставлено и объяснено Csaba в следующем сообщении:

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

Соответственно:

в Java вы действительно можете иметь символ "0x0" в своей строке и этот действительный юникод. Таким образом, чтобы перевести символ 0x0 в UTF8, который, в свою очередь, не принимается, поскольку сервер использует null завершенные строки... так что единственный способ - убедиться, что ваши строки не содержат символ '\ u0000'.

Ответ 4

Вы можете сначала вставить данные в поле 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();

Ответ 5

Одной из причин может быть новая строка для данных столбца в файле