Я так понимаю, что где-то неправильная кодировка, но не пойму где именно.
Важно: кракозябры только в дампе. Приложение, в котором у меня используется эта база данных, отображает кириллицу как надо.
База, которую нужно перенести, содержит кодировку UTF8 и локаль russian_Russia.1251
client_encoding - WIN1251
server_encoding - UTF8
Дамп создаю так:
pg_dump -U postgres -W -E UTF8 -d dbname > dbname.sql
Эксперимента ради, создала другую базу с локалью ru_RU.UTF8.
В дампе те же самые кракозябры, вот такого вида:
h%*h%�%d%h%%h%�%d%h%
Пробовала сделать
SET CLIENT_ENCODING TO UTF8
, дамп всё тот же.
При этом, я пытаюсь перенести базу с Windows на Linux и в Linux с помощью file проверила кодировку получившегося дампа - UTF-16. Хотя я при его создании явно указываю уже UTF8.
Дополню:
Системная локаль у меня в линуксе:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ru_UA.UTF-8
LC_TIME=ru_UA.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ru_UA.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ru_UA.UTF-8
LC_NAME=ru_UA.UTF-8
LC_ADDRESS=ru_UA.UTF-8
LC_TELEPHONE=ru_UA.UTF-8
LC_MEASUREMENT=ru_UA.UTF-8
LC_IDENTIFICATION=ru_UA.UTF-8
LC_ALL=
Список баз с кодировками и локалями там же:
Какие манипуляции делала с уже готовым дампом:
Восстанавливаю данные из дампа в предварительно созданную базу
$ psql -U valen running_events < events.sql
ERROR: invalid byte sequence for encoding "UTF8": 0xff
При этом если открыть файл дампа в редакторе кода, вижу:
SET client_encoding = 'UTF8';
Проверяю кодировку дампа:
$ file events.sql
events.sql: Little-endian UTF-16 Unicode text, with CRLF line terminators
Конвертирую:
$ iconv -f UTF-16 -t UTF-8 events.sql -o events2.sql
файл создался
Вторая попытка восстановить данные уже из конвертированного дампа:
$ psql -U valen running_events < events2.sql
данные записались
Проверяю вывод таблиц из базы:
running_events=# \dt
List of relations
Schema | Name | Type | Owner
----------+----------+-------+----------
public | events | table | postgres
(1 row)
Действительно всё записалось. Но:
running_events=# SELECT * FROM events WHERE id = 1;
Снова кириллица некорректно отображается. Несмотря на то, что у базы running_events русская локаль.
Ещё один момент:
В Windows (т. е. там же, где делаю дамп) происходит та же история. Из дампа данные в базу не записываются.
Ещё дополнение:
Решила проделать всю операцию от начала и до конца в Ubuntu. То есть, я создала базу с кодировкой UTF8 и локалью ru_RU.UTF8, вставила в неё одну запись, содержащую в одном из полей русский текст, потом сделала её дамп. Открыла в редакторе кода - вообще никаких некорректных символов, кириллица тоже отображается.
Восстановила данные из дампа в свежесозданную базу - всё записалось с первого раза. Проверила в psql - на запрос SELECT вижу ту единственную запись, кириллица отображается верно.
И всё же пока не понятно, почему в Windows так упорно не хочет создаваться нормальный дамп...
Файлы дампов на гитхабе:
https://github.com/composercoder/running-events/tr...
В этой директории есть три .sql файла.
- events_dump.sql - дамп основной базы из винды, которую я пытаюсь перенести
- events_dump_converted_to_utf8.sq - тот же, конвертированный в utf8
- events_linux_dump.sql - дамп такой же базы, созданной в убунту, с такой же таблицей, но всего одной записью