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

125

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

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таблицы? Или мне попытаться изменить кодировку файла?

mpen
источник
измените параметр кодировки при импорте. Я установил свой "Windows-1251", и он работал без жалоб.
Brian D
1
Спасибо @BrianD, я тоже столкнулся с этой проблемой, и это сработало для меня.
gouravkr

Ответы:

110

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

Майк Шерилл, "Отзыв кошки"
источник
3
Говорит, что файл имеет формат ASCII, но он содержит символы с диакритическими знаками, так что это должно быть неправильно?
mpen 01
2
Приму этот ответ, но я думаю, что проблема была на самом деле с данными (обновленный Q).
mpen 01
1
Я нашел это полезным, спасибо. Кстати, он работает и на терминалах OS X
Рауль Рене
1
У меня это сработало, но немного по-другому. Команда "iconv" фактически взорвала мой файл, но она сработала именно там, где была проблема - в каком-то странном символе "-". В любом случае, я удалил это, и мой файл смог загрузить в postgres. Спасибо за чаевые!
trip0d199
1
Просто чтобы помочь другим и поисковым системам: это работает для преобразования CSV-экспорта Stripe с нечитаемыми символами обратно в UTF-8: `iconv -f ISO-8859-15 -t utf-8 customers.csv> customers-utf8.csv`
sscarduzio
57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

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

Nobu
источник
1
он завершится без ошибок, он может дать или не дать полезные результаты. вам нужно знать предполагаемую кодировку данных.
Jasen
1
В моем сценарии, как работал вышеуказанный запрос? У меня есть файл csv с кодировкой UTF8 и DB с кодировкой UTF8.
Аджай Такур,
14

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

 set client_encoding to 'latin1'

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


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

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

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

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

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

Абделла Алауи
источник
На Mac это было iconv -c -t UTF-8 filename.csv > filename.utf8.csvдля меня
Майкл
8

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

iconv -f ASCII -t utf-8 // ИГНОРИРОВАТЬ <b.txt> /a.txt

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

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

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

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

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

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

Юрий Левинский
источник
iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
Jasen
5

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

  1. SET client_encoding = 'ISO_8859_5';

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

Рамеш Р
источник
4

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

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

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

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

BobG
источник
4

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

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

Вишал Чхатвани
источник
3

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

Эд Доерр
источник
2

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

sed -i -- 's/\\/|/g' filename.txt
Ричард Гринвуд
источник
2
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

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

Риши Джха
источник
2

Краткий пример решения этой проблемы в PHP-

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

Подробности ошибки: поскольку база данных POSTGRES не обрабатывает символы, отличные от UTF-8, когда мы пытаемся передать указанные выше входные данные в столбец, выдает ошибку «недопустимая последовательность байтов для кодирования« UTF8 »: 0xab».

Поэтому просто преобразуйте это значение в UTF-8 перед вставкой в ​​базу данных POSTGRES.

Ннеха Сачан
источник
2

У меня была такая же проблема: мой файл не был закодирован как UTF-8. Я решил это, открыв файл с помощью блокнота ++ и изменив кодировку файла.

Перейдите в «Кодирование» и выберите «Преобразовать в UTF-8». Сохраните изменения и все!

Франсиско Хавьер Снчес Сабидо
источник
1

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

jaasco
источник
1

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

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

или

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

VRN
источник
1

Я столкнулся с этой проблемой под Windows, работая исключительно с psql (без графических инструментов). Чтобы решить эту проблему, навсегда измените кодировку по умолчанию psql (клиент), чтобы она соответствовала кодировке по умолчанию сервера PostgreSQL. Выполните следующую команду в CMD или Powershell:

setx PGCLIENTENCODING UTF8

Закройте и снова откройте командную строку / Powershell, чтобы изменения вступили в силу.

Измените кодировку файла резервной копии с Unicode на UTF8, открыв его в Блокноте и выбрав Файл -> Сохранить как. Измените раскрывающееся меню «Кодировка» с Unicode на UTF8. (Также измените тип «Сохранить как» с «Текстовые документы (.txt)» на «Все файлы», чтобы не добавлять расширение .txt к имени файла резервной копии). Теперь вы можете восстановить резервную копию.

Хехе
источник
0

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

Джош Бартон
источник
0

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

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

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

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

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

Anupam
источник
0

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

Затем попробуйте импортировать еще раз.

До Нху Ви
источник
0

Если ваш CSV-файл будет экспортирован из SQL Server, он огромен и содержит символы Unicode, вы можете экспортировать его, установив кодировку как UTF-8:

Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...

На следующей странице он спрашивает, хотите ли вы скопировать данные из таблицы или хотите написать запрос. Если у вас есть типы данных charили varcharв вашей таблице, выберите параметр запроса и приведите эти столбцы как nvarchar(max). Например, если myTableесть два столбца, где первый varcharи второй int, я привел первый к nvarchar:

select cast (col1 as nvarchar(max)) col1
       , col2
from myTable
LoMaPh
источник