Я работаю над перемещением нескольких баз данных с сервера Postgresql 8.3 на сервер Postgresql 8.4. Пока все работало нормально, но одна база доставила мне некоторые проблемы. База данных указана как кодированная в кодировке Unicode на сервере 8.3, но каким-то образом клиентской программе удалось внедрить в нее некорректные данные Unicode.
Когда я делаю нормальный дамп и восстанавливаю, используя собственный формат postgres, новый сервер не принимает его, жалуясь на ошибки Unicode.
Я планирую сделать дамп базы данных в виде простого текста, а затем использовать sed, чтобы ничего не заменить недопустимые символы (они не нужны). Но как заставить sed работать с шестнадцатеричными / двоичными значениями в файле?
Согласно ответу Питера, использование iconv - это типичное решение, которое большинство людей используют для очистки плохих данных. Если вы хотите заранее проанализировать данные (и, возможно, очистить их в исходной базе данных), вы можете использовать следующие https://github.com/xzilla/utf8checker найти проблемное место.
Типичное решение - использовать iconv -c
.
Согласно двоичная замена sed в stackoverflow, ваш лучший шанс пройти через hexdump
:
hexdump input | sed -e "..." | xxd -r -p output
Это приведет к удалению всех символов, находящихся вне диапазона 0x32
(пробел) в 0x7e
(тильда):
someprog | LANG=C sed 's/[\x00-\x31\x7f-\xff]//g'
Вы можете использовать другие диапазоны символов, чтобы быть более избирательными.
Коллега подсказал мне в пользу Perl:
cat databasedump.sql | perl -pi -e 's / \ xc3 \ xa9 // g;' > fixeddatabasedump.sql
Хорошо, значит, это не sed, но, по крайней мере, синтаксис более или менее такой же.
tr -d '[:xdigit:]' < old_database > new_database
также может работать.
tr -d удаляет только '[:xdigit:]'
шестнадцатеричные символы