Исправление байтовых последовательностей Юникода - PullRequest
1 голос
/ 11 февраля 2009

Иногда при копировании содержимого в PostgreSQL я получаю сообщения об ошибках, которые содержат недопустимые последовательности байтов.

Существует ли простой способ использования vim или других утилит для обнаружения последовательностей байтов, которые вызывают ошибки, такие как: недопустимая недопустимая последовательность байтов для кодирования "UTF8": 0xde70 и еще много чего, и, возможно, и простой способ сделать преобразование?

Edit:

Каков мой рабочий процесс:

  1. Дамповая база данных sqlite3 (из trac)
  2. Попытка воспроизвести его в postgresql

Может быть, есть более простой способ?

Подробнее Редактировать:

Также попробовал это:

  1. Запуск enca для определения кодировки файла

    • Сказал мне, что это ASCII
  2. Пробовал iconv конвертировать из ASCII в UTF8. Получил ошибку

Что сработало, так это удаление пары ошибочных строк, на которые она жаловалась. Но это не решило настоящую проблему.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2009

Исходя из одного короткого предложения, звучит так, как будто у вас есть текст в одной кодировке (например, ANSI / ASCII), и вы говорите PostgreSQL, что он фактически находится в другой кодировке (Unicode UTF8). Все различные инструменты, которые вы будете использовать: PostgreSQL, Bash, некоторый язык программирования, другой язык программирования, другие данные откуда-то еще, текстовый редактор, IDE и т. Д., Все имеют кодировки по умолчанию, которые могут отличаться, и некоторый шаг Кстати, правильные преобразования не делаются. Я бы проверил поток данных, где он пересекает эти виды границ, чтобы убедиться, что кодировки совпадают или кодировки правильно обнаружены, а текст правильно преобразован.

1 голос
/ 12 февраля 2009

Я понял это. Это не было проблемой кодирования.

Вывод SQLite экранировал строки иначе, чем ожидает Postgres. Были некоторые случаи, когда выводился asdf \ xd \ foo. Я полагаю, что '\ x' заставляло ожидать, что следующие символы будут в кодировке Unicode.

Решением этой проблемы является сброс каждой таблицы отдельно в режиме CSV в sqlite 3.

Первый

sqlite3 db/trac.db .schema | psql

Теперь, по большей части, это делается для копирования данных обратно в

for table in `sqlite3 db/trac.db .schema | grep TABLE | sed 's/.*TABLE \(.*\) (/\1/'`
do              
echo ".mode csv\nselect * from $table;" | sqlite3 db/trac.db | psql -c "copy $table from stdin with csv"
done

Да, вроде как взломать, но это работает.

1 голос
/ 11 февраля 2009

Если вам известна кодировка файла дампа, вы можете преобразовать его в utf-8 с помощью recode. Например, если он закодирован в латинице-1:

recode latin-1..utf-8 < dump_file > new_dump_file

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...