Проблемы с кодировкой в базе данных ogr2ogr и Postgis / PostgreSQL
-
21-09-2019 - |
Вопрос
В нашей организации мы обрабатываем содержимое ГИС в различных форматах файлов.Мне нужно поместить эти файлы в базу данных PostGIS, и это делается с помощью ogr2ogr.Проблема в том, что база данных имеет кодировку UTF8, и файлы могут иметь другую кодировку.
Я нашел описания того, как я могу указать кодировку, добавив параметр options в org2ogr, но, похоже, это не имеет эффекта.
ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \
password=password options='-c client_encoding=latin1'" sourcefile;
Ошибка, которую я получаю, заключается в следующем:
ERROR 1: ALTER TABLE "soer_vd" ADD COLUMN "målsætning" CHAR(10) ERROR: invalid byte sequence for encoding "UTF8": 0xe56c73 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". ERROR 1: ALTER TABLE "soer_vd" ADD COLUMN "påvirkning" CHAR(10) ERROR: invalid byte sequence for encoding "UTF8": 0xe57669 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". ERROR 1: INSERT command for new feature failed. ERROR: invalid byte sequence for encoding "UTF8": 0xf8 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
В настоящее время мой исходный файл представляет собой файл формы, и я почти уверен, что он закодирован Latin1.
Что я здесь делаю не так, и вы можете мне помочь?
С уважением, Каспер
Решение
Похоже, это приведет к установке кодировки клиента на LATIN1.Какую именно ошибку вы получаете?
На случай, если ogr2ogr не передает его должным образом, вы также можете попробовать установить переменную среды PGCLIENTENCODING
к latin1
.
Я предлагаю вам дважды проверить, что они на самом деле LATIN1.Просто бег file
об этом даст вам хорошее представление, если предположить, что он действительно согласован в файле.Вы также можете попробовать отправить его через iconv
чтобы преобразовать его в LATIN1 или UTF8.
Другие советы
Магнус прав, и я обсужу решение здесь.
Я видел возможность сообщить PostgreSQL о кодировке символов, options=’-c client_encoding=xxx’
, использовал много где, но эффекта вроде нет.Если кто-то знает, как работает эта часть, не стесняйтесь рассказать подробнее.
Магнус предложил установить для переменной среды PGCLIENTENCODING значение LATIN1.Согласно списку рассылки, который я запросил, это можно сделать, изменив вызов ogr2ogr:
ogr2ogr -–config PGCLIENTENCODING LATIN1 –f PostgreSQL
PG:”host=hostname user=username dbname=databasename password=password” inputfile
Для меня это ничего не дало.Что мне помогло, так это перед вызовом ogr2ogr:
SET PGCLIENTENCODING=LATIN1
Было бы здорово услышать более подробную информацию от опытных пользователей, и я надеюсь, что это поможет другим :)
В настоящее время, ОГР От GDAL не выполняет никакого перекодирования символьных данных при переводе между векторными форматами.Команда подготовилась RFC 23.1:Поддержка Unicode в OGR документ, в котором обсуждается поддержка перекодирования для драйверов OGR.Тот самый Был принят RFC 23 а основная функциональность уже была выпущена в GDAL 1.6.0.Однако большинство драйверов OGR не были обновлены, включая Драйвер шейп-файла.
На данный момент я бы описал OGR как кодирующего агностика и невежду.Это означает, что OGR действительно берет то, что получает, и отправляет это без какой-либо обработки.OGR использует тип char для манипулирования текстовыми данными.Это прекрасно подходит для обработки многобайтовых строк в кодировке (например, UTF-8) - это просто обычный поток байтов, хранящихся в виде массива элементов char.
Рекомендуется, чтобы разработчики драйверов OGR возвращали строки значений атрибутов в кодировке UTF-8, однако это правило не получило широкого распространения в драйверах OGR, что делает эту функциональность еще не готовой для конечного пользователя.
Вам нужно написать командную строку следующим образом:
PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=...
В Windows команда
SET PGCLIENTENCODING=LATIN1
В Linux
экспорт PGCLIENTENCODING=LATIN1
или
PGCLIENTENCODING=LATIN1
Более того, это обсуждение помогает мне:
На окнах
SET PGCLIENTENCODING=LATIN1 ogr2ogr...
не выдавайте мне никаких ошибок, но ogr2ogr не работает... Мне нужно изменить системную переменную (например.Система -> Расширенные настройки системы -> Переменные среды -> Новая системная переменная) перезагрузите систему и запустите.
огр2огр...
Я решил эту проблему с помощью этой команды:
pg_restore --host localhost --port 5432 --username postgres --dbname {DBNAME} --schema public --verbose "{FILE_PATH to import}"
Не знаю, правильное ли это решение, но у меня оно сработало.