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


змінити параметр кодування при імпорті. Я встановив міну на "Windows-1251", і вона працювала без нарікань.
Брайан Д

1
Дякую @BrianD, я також зіткнувся з цим питанням, і це працювало на мене.
gouravkr

Відповіді:


110

Якщо вам потрібно зберігати дані UTF8 у вашій базі даних, вам потрібна база даних, яка приймає UTF8. Ви можете перевірити кодування вашої бази даних в pgAdmin. Просто клацніть правою кнопкою миші базу даних і виберіть "Властивості".

Але ця помилка, схоже, говорить про те, що у вихідному файлі є деякі недійсні дані UTF8. Це означає, що copyутиліта виявила або здогадалася, що ви подаєте їй файл UTF8.

Якщо ви працюєте в якомусь варіанті Unix, ви можете перевірити кодування (більш-менш) за допомогою fileутиліти.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Я думаю, що це буде працювати і на Macs у терміналі.) Не знаю, як це зробити під 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, але він містить наголошені символи, так що це має бути неправильно?
квітня 11

2
Прийму цю відповідь, але я думаю, що проблема була насправді з даними (оновлений Q).
квітня 11

1
Я вважаю це корисним, дякую. До речі, він працює і на терміналах OS X
Рауль Рене

1
Це працювало для мене, але дещо по-іншому. Команда "iconv" насправді бомбардувала мій файл, але це робилося прямо там, де проблема - якийсь дивний характер "-" характеру. У будь-якому разі я це видалив, і мій файл вдалося завантажити в postgres. Дякую за пораду!
trip0d199

1
Просто для допомоги іншим та пошуковим системам: це працює для перетворення експорту Stvipe CSV з нечитабельними символами в 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У моєму випадку додавання параметра працювало.


1
він завершиться без помилок, він може або не дасть корисних результатів. вам потрібно знати призначене кодування даних.
Ясен

1
Як у моєму сценарії працював вищезапит? У мене файл CSV, закодований з UTF8, і БД, закодований з UTF8.
Аджай Такур

14

Мабуть, я можу просто встановити кодування на льоту,

 set client_encoding to 'latin1'

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


latin1зробила символів розбірливими, але більшість наголошених символів були у верхньому регістрі, де вони не повинні були бути. Я припускав, що це було пов’язано з поганим кодуванням, але я думаю, що це насправді дані, які були просто поганими. Я в кінцевому підсумку зберігав кодування latin1, але попередньо обробив дані та виправив проблеми з корпусом.


Цікаво, що я отримав помилку у 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 // IGNORE <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
Ясен

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.


4

Ну, я зіткнувся з тією ж проблемою. І що вирішило мою проблему, це таке:

У Excel натисніть кнопку Зберегти як. Збережіть як тип, виберіть .csv Клацніть на Інструменти . Потім виберіть веб-параметри зі спадного списку. На вкладці Кодування збережіть документ як Unicode (UTF-8) . Натисніть кнопку ОК. Збережіть файл. Зроблено!


3

У мене була така ж проблема, і я знайшов приємне рішення тут: http://blog.e-shell.org/134

Це викликано невідповідністю кодування вашої бази даних, безумовно, тому, що база даних, звідки ви отримали дамп SQL, була кодована як SQL_ASCII, а нова - закодована як UTF8. .. Recode - це невеликий інструмент від проекту GNU, який дозволяє вам змінювати під час кодування даного файлу.

Тому я просто перекодував dumpfile, перш ніж відтворити його:

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

У системах Debian або Ubuntu перекодування можна встановити через пакет.


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.


1

Для python потрібно використовувати

Клас pg8000.types.Bytea (str) Bytea - це похідний клас, який відображається в байтовий масив PostgreSQL.

або

Pg8000.Binary (значення) Побудувати об'єкт, що містить двійкові дані.


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) Внесіть у файл незначні зміни. Збережіть файл. Скасуйте зміну. Збережіть знову.

Престо! Команда Copy працювала зараз.

(Я думаю, що Atom зберег його у форматі, який працював)


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.