Символ с байтовой последовательностью 0x9d в кодировке "WIN1252" не имеет эквивалента в кодировке "UTF8"

Я читаю файл csv в своем sql-скрипте и копирую его данные в таблицу sql-postgre. Строка кода ниже:

\copy participants_2013 from 'C:/Users/Acrotrend/Desktop/mip_sahil/mip/reelportdata/Participating_Individual_Extract_Report_MIPJunior_2013_160414135957.Csv' with CSV delimiter ',' quote '"' HEADER;

Я получаю следующую ошибку: символ с байтовой последовательностью 0x9d в кодировке "WIN1252" не имеет эквивалента в кодировке "UTF8".

Может ли кто-нибудь помочь мне в решении этой проблемы и как я могу ее решить?

Ответы

Ответ 1

Проблема в том, что 0x9D не является допустимым байтовым значением в WIN1252. Здесь есть таблица: https://en.wikipedia.org/wiki/Windows-1252

Проблема может заключаться в том, что вы импортируете файл UTF-8, а postgresql по умолчанию работает с Windows-1252 (который, по моему мнению, по умолчанию используется во многих системах Windows).

Вам нужно изменить набор символов в командной строке Windows, прежде чем запускать скрипт с помощью chcp. Или в postgresql вы можете:

SET CLIENT_ENCODING TO 'utf8';

Перед импортом файла.

Ответ 2

Любая кодировка имеет числовые диапазоны действительного кода. Вы уверены, что ваши данные в кодировке win1252?

Postgres очень строг и не импортирует никаких возможных кодированных файлов. Вы можете использовать iconv который может работать в толерантном режиме, и он может удалить сломанные символы. После очистки iconv вы можете импортировать файл.

Ответ 3

Просто укажите encoding 'UTF-8' в качестве кодировки в команде \copy, например (я разбил ее на две строки для удобства чтения, но держу все в одной строке):

\copy dest_table from 'C:/src-data.csv' 
                 (format csv, header true, delimiter ',', encoding 'UTF8');

Больше деталей:

Проблема заключается в том, что для Client Encoding установлено значение WIN1252, скорее всего потому, что оно работает на компьютере с Windows, но в файле есть символ UTF-8.

Вы можете проверить кодировку клиента с помощью

SHOW client_encoding;

 client_encoding
-----------------
WIN1252