Неверная последовательность байтов для кодировки "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
Как мне это исправить? Нужно ли менять кодировку всей моей базы данных (если да, как?) Или я могу изменить только кодировку моей tmp
Таблица? Или я должен попытаться изменить кодировку файла?
24 ответа
Если вам нужно хранить данные 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';
Добавление encoding
вариант сработал в моем случае.
Если вы в порядке с удалением неконвертируемых символов, вы можете использовать -c
флаг
iconv -c -t utf8 filename.csv > filename.utf8.csv
а затем скопировать их на свой стол
Видимо, я могу просто установить кодировку на лету,
set client_encoding to 'latin1'
А затем повторите запрос. Не уверен, какую кодировку я должен использовать, хотя.
latin1
сделал символы разборчивыми, но большинство акцентированных символов были в верхнем регистре, где они не должны были быть. Я предположил, что это произошло из-за плохой кодировки, но я думаю, что на самом деле это были просто плохие данные. В итоге я сохранил кодировку latin1, но предварительно обработал данные и исправил проблемы с корпусом.
У меня была такая же проблема: мой файл не был закодирован как UTF-8. Я решил это, открыв файл с помощью блокнота ++ и изменив кодировку файла.
Перейдите в "Кодирование" и выберите "Преобразовать в UTF-8". Сохраните изменения и все!
Эта ошибка означает, что кодировка записей в файле отличается по отношению к соединению. В этом случае iconv может вернуть ошибку, иногда даже несмотря на флаг //IGNORE:
iconv -f ASCII -t utf-8 //IGNORE
iconv: недопустимая последовательность ввода в позиции (некоторое число)
Хитрость заключается в том, чтобы найти неправильные символы и заменить их. Для этого в Linux используйте редактор "vim":
vim (ваш текстовый файл), нажмите "ESC": кнопку и введите ":goto (число, возвращаемое iconv)"
Чтобы найти не ASCII символы, вы можете использовать следующую команду:
grep --color = 'auto' -P "[\ x80- \ xFF]"
Если вы удалите неправильные символы, проверьте, действительно ли вам нужно конвертировать файл: возможно, проблема уже решена.
Выполните следующие шаги, чтобы решить эту проблему в pgadmin:
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
Ну, я столкнулся с той же проблемой. И что решило мою проблему, так это:
В Excel нажмите Сохранить как. От типа сохранения, выберите .csv Нажмите на Инструменты. Затем выберите веб-параметры из выпадающего списка. На вкладке " Кодировка " сохраните документ в формате Unicode (UTF-8). Нажмите ОК. Сохраните файл. СДЕЛАННЫЙ!
Это зависит от того, какой тип машины / кодировки генерирует ваш файл импорта.
Если вы получаете его из английской или западноевропейской версии Windows, вам лучше всего установить для него значение "WIN1252". Если вы получаете его из другого источника, посмотрите список кодировок здесь:
http://www.postgresql.org/docs/8.3/static/multibyte.html
Если вы получаете его с Mac, вам, возможно, придется сначала запустить его с помощью утилиты iconv, чтобы преобразовать его из MacRoman в UTF-8.
Я столкнулся с этой проблемой под Windows, работая исключительно с psql (без графических инструментов). Чтобы решить эту проблему, навсегда измените кодировку по умолчанию psql (клиент), чтобы она соответствовала кодировке по умолчанию сервера PostgreSQL. Выполните следующую команду в CMD или Powershell:
setx PGCLIENTENCODING UTF8
Закройте и снова откройте командную строку /Powershell, чтобы изменения вступили в силу.
Измените кодировку файла резервной копии с Unicode на UTF8, открыв его в Блокноте и выбрав Файл -> Сохранить как. Измените раскрывающееся меню "Кодировка" с Unicode на UTF8. (Также измените тип "Сохранить как" с "Текстовые документы (.txt)" на "Все файлы", чтобы не добавлять расширение.txt к имени файла резервной копии). Теперь вы сможете восстановить резервную копию.
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';
Вы можете попробовать это для обработки кодировки UTF8.
Краткий пример решения этой проблемы в PHP-
$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);
Сведения об ошибке: поскольку база данных POSTGRES не обрабатывает символы, отличные от UTF-8, когда мы пытаемся передать указанные выше входные данные в столбец, выдает ошибку "недопустимая последовательность байтов для кодирования"UTF8": 0xab" .
Поэтому просто преобразуйте это значение в UTF-8 перед вставкой в базу данных POSTGRES.
Откройте файл csv в Excel и сохраните его в формате utf8-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 перекодировка может быть установлена через пакет.
Вы можете заменить символ обратной косой черты, например, символ трубы, на sed.
sed -i -- 's/\\/|/g' filename.txt
Эта ошибка может возникнуть, если входные данные содержат сам символ перехода. По умолчанию управляющим символом является символ "\", поэтому, если ваш входной текст содержит символ "\", попробуйте изменить значение по умолчанию с помощью опции ESCAPE.
Альтернативная причина в Windows с pgadmin v4.4:
Имена столбцов с символами, отличными от ASCII, как-то испортят
psql
import и выдает это неинтуитивное сообщение об ошибке. Возможно, ваши данные CSV UTF8 в порядке.
Решение:
Переименуйте свои поля.
Пример:
"Résultat" -> resultat
Для Python вам нужно использовать
Класс pg8000.types.Bytea (str) Bytea - это производный от str класс, который отображается в байтовый массив PostgreSQL.
или же
Pg8000.Binary (значение) Построить объект, содержащий двоичные данные.
Открыть файл CSV с помощью Notepad++ . Выберите меню Encoding
\ Encoding in UTF-8
, а затем починить несколько клеток вручную.
Затем попробуйте импортировать снова.
лучше выявлять проблемные строки командой:
grep -naxv '.*' source_data.txt
Я получил ту же ошибку, когда пытался скопировать csv, сгенерированный Excel, в таблицу Postgres (все на Mac). Вот как я решил это:
1) Откройте файл в Atom (IDE, который я использую)
2) Внесите незначительные изменения в файл. Сохраните файл. Отмените изменение. Сохраните снова.
Presto! Команда копирования теперь работает.
(Я думаю, что Atom сохранил его в формате, который работал)
Если ваш 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
Также возможно с этой ошибкой, что поле зашифровано на месте. Убедитесь, что вы смотрите на нужную таблицу, в некоторых случаях администраторы создают незашифрованное представление, которое вы можете использовать вместо этого. Недавно я столкнулся с очень похожей проблемой.
некоторые из lolution могут быть очень Sambles
Если в имени comlun есть пробелы, это вызовет эту проблему
просмотрите каждое имя столбца для exaple
"colum_name "
#>> ронг
"colum_nam"
#>> правильно