Я пытаюсь импортировать данные в свою базу данных. Итак, я создал временную таблицу,
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
таблицы? Или мне попытаться изменить кодировку файла?
postgresql
import
mpen
источник
источник
Ответы:
Если вам нужно хранить данные UTF8 в своей базе данных, вам нужна база данных, которая принимает UTF8. Вы можете проверить кодировку своей базы данных в pgAdmin. Просто щелкните базу данных правой кнопкой мыши и выберите «Свойства».
Но эта ошибка, похоже, говорит вам, что в вашем исходном файле есть недопустимые данные UTF8. Это означает, что
copy
утилита обнаружила или догадалась, что вы загружаете ей файл UTF8.Если вы работаете под каким-либо вариантом Unix, вы можете проверить кодировку (более или менее) с помощью
file
утилиты.(Я думаю, что это будет работать и на Mac в терминале.) Не знаю, как это сделать в Windows.
Если вы используете ту же утилиту для файла, полученного из систем Windows (то есть файла, который не закодирован в UTF8), он, вероятно, покажет что-то вроде этого:
Если что-то останется странным, вы можете попытаться преобразовать входные данные в известную кодировку, изменить кодировку вашего клиента или и то, и другое. (Мы действительно расширяем границы моих знаний о кодировках.)
Вы можете использовать
iconv
утилиту для изменения кодировки входных данных.Вы можете изменить кодировку psql (клиентская), следуя инструкциям по поддержке набора символов . На этой странице найдите фразу «Чтобы включить автоматическое преобразование набора символов».
источник
encoding
В моем случае сработала опция добавления .источник
Видимо я могу просто на лету установить кодировку ,
А затем повторно запустите запрос. Не уверен, какую кодировку мне следует использовать.
latin1
сделал символы разборчивыми, но большинство акцентированных символов были в верхнем регистре, где их не должно было быть. Я предположил, что это произошло из-за плохой кодировки, но я думаю, что на самом деле это были просто плохие данные. В итоге я сохранил кодировку latin1, но предварительно обработал данные и исправил проблемы с корпусом.источник
Если вы не против отбрасывать неконвертируемые символы, вы можете использовать
-c
флага затем скопируйте их в свою таблицу
источник
iconv -c -t UTF-8 filename.csv > filename.utf8.csv
для меняЭта ошибка означает, что кодировка записей в файле отличается в зависимости от соединения. В этом случае 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
выполните следующие действия, чтобы решить эту проблему в pgadmin:
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
источник
Это зависит от того, какой тип машины / кодировки сгенерировал ваш файл импорта.
Если вы получаете его из английской или западноевропейской версии Windows, лучше всего, вероятно, установить для него значение «WIN1252». Если вы получаете его из другого источника, ознакомьтесь со списком кодировок здесь:
http://www.postgresql.org/docs/8.3/static/multibyte.html
Если вы получаете его с Mac, вам может потребоваться сначала запустить его с помощью утилиты «iconv», чтобы преобразовать его из MacRoman в UTF-8.
источник
Ну, я столкнулся с той же проблемой. И вот что решило мою проблему:
В Excel нажмите «Сохранить как». В списке «Сохранить как тип» выберите .csv. Нажмите « Инструменты» . Затем выберите веб-параметры из раскрывающегося списка. На вкладке « Кодировка » сохраните документ в формате Unicode (UTF-8) . Щелкните ОК. Сохраните файл. СДЕЛАНО !
источник
У меня была такая же проблема, и я нашел здесь хорошее решение: http://blog.e-shell.org/134
Поэтому я просто перекодировал файл дампа перед воспроизведением:
В системах Debian или Ubuntu перекодирование можно установить через package.
источник
Вы можете заменить символ обратной косой черты, например, вертикальной чертой на sed.
источник
вы можете попробовать это для обработки кодировки UTF8.
источник
Краткий пример решения этой проблемы в PHP-
Подробности ошибки: поскольку база данных POSTGRES не обрабатывает символы, отличные от UTF-8, когда мы пытаемся передать указанные выше входные данные в столбец, выдает ошибку «недопустимая последовательность байтов для кодирования« UTF8 »: 0xab».
Поэтому просто преобразуйте это значение в UTF-8 перед вставкой в базу данных POSTGRES.
источник
У меня была такая же проблема: мой файл не был закодирован как UTF-8. Я решил это, открыв файл с помощью блокнота ++ и изменив кодировку файла.
Перейдите в «Кодирование» и выберите «Преобразовать в UTF-8». Сохраните изменения и все!
источник
Эта ошибка может возникнуть, если входные данные содержат сам escape-символ. По умолчанию escape-символ - это символ «\», поэтому, если ваш вводимый текст содержит символ «\» - попробуйте изменить значение по умолчанию, используя опцию ESCAPE.
источник
Для python вам нужно использовать
Класс pg8000.types.Bytea (str) Bytea - это класс, производный от str, который отображается в массив байтов PostgreSQL.
или
Pg8000.Binary (значение) Создает объект, содержащий двоичные данные.
источник
Я столкнулся с этой проблемой под Windows, работая исключительно с psql (без графических инструментов). Чтобы решить эту проблему, навсегда измените кодировку по умолчанию psql (клиент), чтобы она соответствовала кодировке по умолчанию сервера PostgreSQL. Выполните следующую команду в CMD или Powershell:
Закройте и снова откройте командную строку / Powershell, чтобы изменения вступили в силу.
Измените кодировку файла резервной копии с Unicode на UTF8, открыв его в Блокноте и выбрав Файл -> Сохранить как. Измените раскрывающееся меню «Кодировка» с Unicode на UTF8. (Также измените тип «Сохранить как» с «Текстовые документы (.txt)» на «Все файлы», чтобы не добавлять расширение .txt к имени файла резервной копии). Теперь вы можете восстановить резервную копию.
источник
При этой ошибке также очень возможно, что поле зашифровано на месте. Убедитесь, что вы смотрите правильную таблицу, в некоторых случаях администраторы создают незашифрованное представление, которое вы можете использовать вместо этого. Недавно я столкнулся с очень похожей проблемой.
источник
У меня такая же ошибка, когда я пытался скопировать csv, созданный Excel, в таблицу Postgres (все на Mac). Вот как я это решил:
1) Откройте файл в Atom (IDE, которую я использую)
2) Внесите в файл незначительные изменения. Сохраните файл. Отменить изменение. Сохраните еще раз.
Presto! Теперь команда копирования работала.
(Я думаю, что Atom сохранил его в формате, который работал)
источник
Откройте файл CSV с помощью Notepad ++. Выберите меню
Encoding
\Encoding in UTF-8
, затем исправьте несколько ячеек вручную.Затем попробуйте импортировать еще раз.
источник
Если ваш 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
:источник