Задать вопрос
FairyTaleComposer
@FairyTaleComposer

Как исправить кракозябры вместо кириллицы в дампе PostgreSQL?

Я так понимаю, что где-то неправильная кодировка, но не пойму где именно.

Важно: кракозябры только в дампе. Приложение, в котором у меня используется эта база данных, отображает кириллицу как надо.

База, которую нужно перенести, содержит кодировку 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=


Список баз с кодировками и локалями там же:
6223b97fc16a7682238272.png

Какие манипуляции делала с уже готовым дампом:

Восстанавливаю данные из дампа в предварительно созданную базу
$ 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;
6223ba527ccfe421194528.png

Снова кириллица некорректно отображается. Несмотря на то, что у базы 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 - дамп такой же базы, созданной в убунту, с такой же таблицей, но всего одной записью
  • Вопрос задан
  • 7518 просмотров
Подписаться 1 Средний 24 комментария
Решения вопроса 1
@galaxy
Попробуйте сделать дамп так:
pg_dump -U postgres -W -E UTF8 -d dbname -f dbname.sql

т.к. возможно глючит перенаправление
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы