2011-02-01 5 views
86

Я trying to import some data в моей базе. Таким образом, я создал временную таблицу,Неверная последовательность байтов для кодирования "UTF8"

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

И теперь я пытаюсь импортировать the data,

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

Но тогда я получаю ошибку,

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

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

+0

изменить параметр кодировки на импорт. Я установил свой «Windows-1251», и он работал без жалобы. –

ответ

80

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

+2

Говорит, что файл ASCII, но содержит символы с акцентом, так что это должно быть неправильно? – mpen

+0

@Mark: Ну, либо PostgreSQL-копия угадывает неправильно, либо утилита для файлов ошибочна. Для файла Windows с акцентами 'file' сообщает мне« текст ISO-8859 с терминаторами линии CRLF ». Документы для 'copy'say '. Входные данные интерпретируются в соответствии с текущей клиентской кодировкой.даже если данные не проходят через клиент, но читаются или записываются в файл непосредственно сервером. «Хм ... Думаю, я знаю, как это изменить. –

+0

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

4

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

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

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

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

5

Эта ошибка означает, что кодировка записей в файле отличается от отношения.В этом случае Iconv может вернуть ошибку, иногда даже несмотря на // ИГНОРИРУЙТЕ флаг:

Iconv -f ASCII -t UTF-8 // ИГНОРИРУЙТЕ < b.txt> /a.txt

Iconv: (некоторая цифра)

Трюк заключается в том, чтобы найти неправильные символы и заменить их. Для того, чтобы сделать это на Linux используют «ВИМ» редактор:

VIM (ваш текстовый файл), нажмите «ESC»: кнопка и тип «: Гото (число возвращаемый Iconv)»

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

Grep --color = «авто» -P «[\ x80- \ XFF]»

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

+0

' iconv -c -f utf8 -t utf8 // IGNORE < dirty.txt > clean.txt' – Jasen

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

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

+0

будет завершен без ошибок, он может дать или не дать полезные результаты. вам нужно знать предполагаемое кодирование данных. – Jasen

+0

В моем сценарии, как работал выше запрос? У меня есть файл csv, закодированный с UTF8 и DB, закодированный с помощью UTF8. –

0

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

1

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

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

Видимо, я могу просто set the encoding на лету,

set client_encoding to 'latin1' 

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


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

+0

Интересно, что я получил ошибку в инструкции SELECT! Это решило это, потому что именно мой psql * client * дал ошибку, а не сама база данных. (Который бы отклонил данные, в первую очередь, запретил кодирование). – Wildcard

0

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

3

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

В excel нажмите «Сохранить как». От сохранения как тип, выберите .csv Нажмите на Инструменты. Затем выберите веб-опции из выпадающего списка. Под Кодировка вкладка, сохранить документ как Юникод (UTF-8). Нажмите «ОК». Сохраните файл. СДЕЛАННЫЙ !

2

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

  1. SET client_encoding = 'ISO_8859_5';

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

2

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

0

У меня такая же ошибка, когда я пытался скопировать CSV, сгенерированный Excel, в таблицу Postgres (все на Mac). Вот как я решил это:

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

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

Presto! Теперь команда копирования работает.

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

0

Для питона, вам нужно использовать

Класс pg8000.types.Bytea (ул) BYTEA является Обл-производный класс, который является сопоставлен с массивом байтов PostgreSQL.

или

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

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

Вы можете попробовать это, чтобы обрабатывать кодировку UTF8.

1

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

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

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

Смежные вопросы