недопустимая последовательность байтов для кодирования " UTF8"

Я пытаюсь импортировать некоторые данные в мою базу данных. Поэтому я создал временную таблицу,

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

и теперь я пытаюсь импортировать данные,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

но потом я получаю ошибку,

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

как это исправить? Нужно ли менять кодировку всей базы данных (если да, то как?) или я могу изменить только кодировку my tmp таблицы? Или попытаться изменить кодировку файла?

16 ответов


Если вам нужно хранить данные UTF8 в вашей базе данных, вам нужна база данных, которая принимает UTF8. Вы можете проверить кодировку своей базы данных в pgAdmin. Просто щелкните правой кнопкой мыши базу данных, и выберите "Свойства".

но эта ошибка, похоже, говорит вам, что в вашем исходном файле есть недопустимые данные UTF8. Это означает, что copy утилита обнаружила или догадалась, что вы подаете ей файл UTF8.

если вы работаете под некоторым вариантом Unix, вы можете проверить кодирование (более или менее) с file утилиты.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Я думаю, что это будет работать на Mac в терминале тоже.) Не знаете, как это сделать под Windows.

если вы используете ту же утилиту в файле, который пришел из систем Windows (то есть файл, который не закодировано в UTF8), он, вероятно, покажет что-то вроде этого:

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

если вещи остаются странными, вы можете попытаться преобразовать свои входные данные в известную кодировку, чтобы измените кодировку клиента или и то, и другое. (Мы действительно растягиваем границы моих знаний о кодировках.)

можно использовать iconv программа для изменения кодировки входных данных.

iconv -f original_charset -t utf-8 originalfile > newfile

вы можете изменить кодировку psql (клиент), следуя инструкциям на Поддержка Набора Символов. На этой странице найдите фразу"включить автоматическое преобразование набора символов".


psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

добавлять работала в моем случае.


видимо, я могу просто установить кодировку на ходу

 set client_encoding to 'latin1'

а затем повторно запустите запрос. Не уверен, какую кодировку я должен использовать.


latin1 сделал символы разборчивыми, но большинство акцентированных символов были в верхнем регистре, где они не должны были быть. Я предположил, что это связано с плохой кодировкой, но я думаю, что это на самом деле данные, которые были просто плохими. Я закончил тем, что сохранил кодировку latin1, но предварительно обработал данные и исправлены проблемы с корпусом.


эта ошибка означает, что кодировка записей в файле отличается по отношению к соединению. В этом случае iconv может вернуть ошибку, иногда даже несмотря на флаг / / IGNORE:

iconv-F ASCII-t utf-8 / / игнорировать /a.txt

iconv: незаконная последовательность ввода в позиции (некоторое число)

фокус в том, чтобы найти неправильные символы и заменить его. Для этого в Linux используйте редактор" vim":

vim (ваш текстовый файл), нажмите "ESC": кнопка и тип": goto (номер, возвращаемый iconv)"

чтобы найти символы, отличные от ASCII, вы можете использовать следующую команду:

grep --color= 'auto' - P " [\x80 - \xFF]"

Если вы удалите неправильные символы, пожалуйста, проверьте, действительно ли вам нужно конвертировать файл: возможно проблема уже решена.


Это зависит от того, какой тип машины/кодировки сгенерировал ваш файл импорта.

Если вы получаете его из английской или западноевропейской версии Windows, лучше всего, вероятно, установить его в "WIN1252". Если вы получаете его из другого источника, обратитесь к списку кодировок символов здесь:

http://www.postgresql.org/docs/8.3/static/multibyte.html

Если вы получаете его от Mac, вы, возможно, придется запустить его через утилита "iconv" сначала преобразует ее из MacRoman в UTF-8.


Ну я столкнулся с той же проблемой. И вот что решило мою проблему:--1-->

в excel нажмите "Сохранить как". В поле Сохранить как тип выберите .csv Нажмите на инструменты. Выберите параметры веб-документа из выпадающего списка. Под кодирование tab, сохраните документ как Unicode (UTF-8). нажимать OK. Сохранить файл. Готово !


можно заменить символ обратной косой черты, например символом канала, символом sed.

sed -i -- 's/\/|/g' filename.txt

выполните следующие действия, чтобы решить эту проблему в pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;


У меня была такая же проблема, и я нашел хорошее решение здесь: http://blog.e-shell.org/134

это вызвано несоответствием в кодировках базы данных, конечно, потому, что база данных, из которой вы получили дамп SQL, была закодирована как SQL_ASCII, а новая-как UTF8. .. Recode-это небольшой инструмент из проекта GNU, который позволяет изменять кодировку данного файла на лету.

поэтому я просто перекодировал файл дампа перед игрой обратно:

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

в системах Debian или Ubuntu recode может быть установлен через пакет.


Если вы в порядке с отбрасыванием неконвертируемых символов, вы можете использовать -c флаг

iconv -c -t utf8 filename.csv > filename.utf8.csv

а затем скопируйте их в свою таблицу


для python вам нужно использовать

класс pg8000.типы.Bytea (str) Bytea является производным от str классом, который сопоставляется с массивом байтов PostgreSQL.

или

Pg8000.Двоичное значение) Построить объект, содержащий двоичные данные.


copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

вы можете попробовать это для обработки кодировки UTF8.


эта ошибка может возникнуть, если входные данные содержат в себе символ. По умолчанию escape-символ является символом"\", поэтому, если ваш входной текст содержит символ " \ " - попробуйте изменить значение по умолчанию с помощью опции ESCAPE.


также очень возможно с этой ошибкой, что поле зашифровано на месте. Убедитесь, что вы смотрите правильную таблицу, в некоторых случаях администраторы создадут незашифрованное представление, которое можно использовать вместо этого. Недавно я столкнулся с очень похожей проблемой.


Я получил ту же ошибку, когда пытался скопировать csv, сгенерированный Excel, в таблицу Postgres (все на Mac). Вот как я решил это:--1-->

1) Откройте файл в Atom (IDE, который я использую)

2) внесите незначительное изменение в файл. Сохранить файл. Отменить изменения. Сохранить снова.

вуаля! Команда копирования теперь работала.

(Я думаю, что Atom сохранил его в формате, который работал)


открыть файл CSV с помощью Notepad++ . Выберите меню Encoding \ Encoding in UTF-8, затем исправьте несколько ячеек вручную.

повторите попытку импорта.