неверная последовательность байтов для кодировки "UTF8" - PullRequest
115 голосов
/ 01 февраля 2011

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

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

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

Ответы [ 16 ]

102 голосов
/ 01 февраля 2011

Если вам нужно хранить данные 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 (клиента), следуя инструкциям Поддержка набора символов .На этой странице найдите фразу «Включение автоматического преобразования набора символов».

45 голосов
/ 22 мая 2014
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Добавление опции encoding работало в моем случае.

13 голосов
/ 23 сентября 2015

Очевидно, я могу просто установить кодировку на лету,

 set client_encoding to 'latin1'

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


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

8 голосов
/ 03 ноября 2017

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

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

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

6 голосов
/ 11 июня 2013

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

iconv -f ASCII -t utf-8 // IGNORE /a.txt

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

Хитрость заключается в том, чтобы найти неправильные символы и заменить их.Чтобы сделать это в Linux, используйте редактор «vim»:

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

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

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

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

4 голосов
/ 26 мая 2016

Ну, я столкнулся с той же проблемой.И что решило мою проблему, это:

В Excel нажмите Сохранить как.В качестве типа сохранения выберите .csv Нажмите Инструменты .Затем выберите веб-параметры из выпадающего списка.На вкладке Кодировка сохраните документ как Юникод (UTF-8) .Нажмите ОК.Сохраните файл.СОВЕРШЕНО!

4 голосов
/ 01 февраля 2011

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

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

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

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

3 голосов
/ 13 марта 2017

У меня была такая же проблема, и я нашел хорошее решение здесь: 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 перекодировка может быть установлена ​​через пакет.

3 голосов
/ 25 августа 2016

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

  1. SET client_encoding = 'ISO_8859_5';

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

2 голосов
/ 15 июня 2015

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

sed -i -- 's/\\/|/g' filename.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...