Как исправить кириллицу в psql

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана — студенческое сообщество

Postgresql logo.png

В статье пойдёт речь о том, как добиться корректного вывода кириллицы в «консоли» Windows (cmd.exe).

Содержание

  • 1 Описание проблемы
  • 2 Решение проблемы
    • 2.1 Суть
    • 2.2 Конкретные действия
      • 2.2.1 Супер быстро и просто
      • 2.2.2 Быстро и просто
      • 2.2.3 Посложнее и подольше

Описание проблемы

В дистрибутив PostgreSQL, помимо всего прочего, для работы с СУБД входит:

  • приложение с графическим интерфейсом pgAdmin;
  • консольная утилита psql.

При работе с psql в среде Windows пользователи всегда довольно часто сталкиваются с проблемой вывода кириллицы. Например, при отображении результатов запроса к таблице, в полях которых хранятся строковые данные на русском языке.

Psql.codepage.fail.png

Ну и зачем тогда работать с psql, кому нужно долбить клавиатурой в консольке, когда можно всё сделать красиво и быстро в pgAdmin? Ну, не всегда pgAdmin доступен, особенно если речь идёт об удалённой машине. Кроме того, выполнение SQL-запросов в текстовом режиме консоли — это +10 к хакирству.

Решение проблемы

Версии ПО:

  • MS Windows 7 SP1 x64;
  • PostgreSQL 8.4.12 x32.

На сервере имеется БД, созданная в кодировке UTF8.

Суть

Суть проблемы в том, что cmd.exe работает (и так будет до скончания времён) в кодировке CP866, а сама Windows — в WIN1251, о чём psql предупреждает при начале работы:

WARNING: Console code page (866) differs from Windows code page (1251)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.

Значит, надо как-то добиться, чтобы кодировка была одна.

В разных источниках встречаются разные рецепты, включая правку реестра и подмену файлов в системных папках Windows. Ничего этого делать не нужно, достаточно всего трёх шагов:

  1. сменить шрифт у cmd.exe;
  2. сменить текущую кодовую страницу cmd.exe;
  3. сменить кодировку на стороне клиента в psql.

Конкретные действия

Супер быстро и просто

Запускаете cmd.exe, оттуда psql:

psql -d ВАШАБАЗА -U ВАШЛОГИН

Далее:

psql ! chcp 1251

Posgresql console 1251.png

Быстро и просто

Запускаете cmd.exe, оттуда psql:

psql -d ВАШАБАЗА -U ВАШЛОГИН

Вводите пароль (если установлен) и выполняете команду:

set client_encoding='WIN866';

И всё. Теперь результаты запроса, содержащие кириллицу, будут отображаться нормально. Но есть небольшой косяк:

Psql.codepage.866.png

Потому предлагаем ещё способ, который этого недостатка лишён.

Посложнее и подольше

Запустить cmd.exe, нажать мышью в правом левом верхнем углу окна, там Свойства — Шрифт — выбрать Lucida Console. Нажать ОК.

Psql.console.font.png

Выполнить команду:

chcp 1251

В ответ выведет:

Текущая кодовая страница: 1251

Запустить psql;

psql -d ВАШАБАЗА -U ВАШЛОГИН

Кстати, обратите внимание — теперь предупреждения о несовпадении кодировок нет.

Выполнить:

set client_encoding='win1251';

Он выведет:

SET

Всё, теперь кириллица будет нормально отображаться.

Проверяем:

Psql.codepage.ok.png

Работаю в windows 10, в файле находится INSERT в с данными в базу postgresql, часть данных кириллицей написана. При импорте данных через cmd

user>psql -U postgres test < C:/Users/Documents/sql/data.sql

происходит корректное отображение данных в таблице psql (id 2, 3 таблицы). Но когда тот же самый файл импортирую через оболочку psql

# psql -U postgres test < i C:/Users/Documents/sql/data.sql;

кириллические символы отображаются в psql уже как кракозябры (id 1, 4).

# select * from test_table_one;
 id |       name       | price |  description
----+------------------+-------+----------------
  1 | сосисоны |  15.6 | йцукенъ
  2 | сосисоны         |  15.6 | йцукенъ
  3 | сосисоны         |  15.6 | йцукенъ
  4 | сосисоны |  15.6 | йцукенъ

кодировка базы такая:

# l
      Список баз данных
    Имя   | Владелец | Кодировка |     LC_COLLATE     |     LC_CTYPE        |
----------+----------+-----------+--------------------+---------------------
test      | postgres | UTF8      | Russian_Russia.1251| Russian_Russia.1251 |

psql encoding:

# SHOW client_encoding;
 client_encoding
-----------------
 WIN1251
(1 строка)

есть предположение, что это из-за локаля. Но как поменять его не знаю. Пробовал при создании базы указывать LC_COLLATE='Russian_Russia.UTF8' или LC_COLLATE='ru_RU.UTF8', но psql таких значений не принимает, только Russian_Russia.1251 или Russian_Russia.866.

Подскажите, пожалуйста, как брать данные из файла, находясь в psql, чтобы кириллица корректно отображалась.

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

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

База, которую нужно перенести, содержит кодировку 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 — дамп такой же базы, созданной в убунту, с такой же таблицей, но всего одной записью

Содержание

  1. Postgresql кириллица в psql под windows
  2. Комментарии
  3. Я тоже удивлён, что люди не
  4. И вы-таки правы. Даже
  5. А это потому, что локализация
  6. Нестареющий совет о чтении
  7. Призрак Басенджи
  8. 27 августа 2018 г.
  9. PostgreSQL. Кириллица в psql под Windows
  10. Описание проблемы
  11. Решение проблемы
  12. Конкретные действия
  13. Очень быстро и просто
  14. Быстро и просто
  15. Посложнее и подольше
  16. Postgresql кириллица в psql под windows
  17. 23.3.1. Поддерживаемые кодировки
  18. 23.3.2. Настройка кодировки
  19. Важно
  20. 23.3.3. Автоматическая перекодировка между сервером и клиентом
  21. 23.3.4. Дополнительные источники информации
  22. Postgresql кириллица в psql под windows
  23. 23.3.1. Поддерживаемые кодировки
  24. 23.3.2. Настройка кодировки
  25. Важно
  26. 23.3.3. Автоматическая перекодировка между сервером и клиентом
  27. 23.3.4. Дополнительные источники информации
  28. Содержание
  29. Описание проблемы
  30. Решение проблемы
  31. Конкретные действия
  32. Супер быстро и просто
  33. Быстро и просто
  34. Посложнее и подольше

Postgresql кириллица в psql под windows

В общем-то, это не сама статья, а только ссылка на неё.

В своё время столкнувшись с проблемой отображения кириллицы в psql под Windows, я был удивлён разнообразием и бесполезностью решений, как это реализовать. В основном, предлагается править реестр и прибегать к иным шаманским приёмам.

Этот пост я написал здесь по рекомендации посетителя, оставившего запись в обсуждении упомянутой страницы.

Комментарии

Я тоже удивлён, что люди не

Я тоже удивлён, что люди не могут такую ерунду решить и ещё целые статьи пишут на эту тему.
Всё решается намного проще:

И вы-таки правы. Даже

И вы-таки правы. Даже странно, что это не пришло в голову при смене кодировки в psql. Действительно, шрифт тогда менять не надо.

Однако, вывод количества строк под таблицей всё же остался в иероглифах, хотя в самой таблице всё нормально отображается на русском: (скриншот почему-то не отображается)

Вот ещё на него ссылка: i.imgur.com/0r9AZgh.png

А это потому, что локализация

А это потому, что локализация разная. Через client_encoding вы говорите в какой кодировке сервер должен отдавать данные клиенту. А кроме этого, в самом клиенте есть перевод интерфейса. И этот перевод интерфейса работает с СИСТЕМНОЙ локалью, а на client_enconding ему плевать. Путей решения несколько: добавить перевод в нужной кодировке, изменить настройки системной локали.

Нестареющий совет о чтении

Нестареющий совет о чтении документации по прежнему в силе.
В конце раздела посвященного psql есть специальная сноска «Notes for Windows Users», где и раскрыт «секрет».

При переводе на русский можно будет заменить пример с немецкой 1252 на кириллицу с 1251.

Источник

Призрак Басенджи

Записки начинающего программиста.

27 августа 2018 г.

PostgreSQL. Кириллица в psql под Windows

В статье речь идет о том, как добиться корректного вывода кириллицы в консоли Windows – cmd.exe.

Описание проблемы

gbp00010

Решение проблемы

Конкретные действия

Очень быстро и просто

gbp00011

Быстро и просто

Запускаем cmd.exe, оттуда psql:

Вводим пароль (если установлен) и выполняем следующую команду:

И все. Теперь результаты запроса, содержащие кириллицу, будут отображаться нормально. Но есть небольшой косяк:

gbp00012

Посложнее и подольше

gbp00013

Текущая кодовая страница: 1251

Кстати, обратим внимание – теперь предупреждения о несовпадении кодировок нет.

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

Источник

Postgresql кириллица в psql под windows

Важным ограничением, однако, является то, что кодировка каждой базы данных должна быть совместима с параметрами локали базы данных LC_CTYPE (классификация символов) и LC_COLLATE (порядок сортировки строк). Для локали C или POSIX подойдёт любой набор символов, но для других локалей есть только одна кодировка, которая будет работать правильно. (Однако в среде Windows кодировка UTF-8 может использоваться с любой локалью.)

23.3.1. Поддерживаемые кодировки

Таблица 23.1. Кодировки PostgreSQL

23.3.2. Настройка кодировки

При создании базы данных можно указать кодировку, отличную от заданной по умолчанию, если эта кодировка совместима с выбранной локалью:

Важно

23.3.3. Автоматическая перекодировка между сервером и клиентом

Таблица 23.2. Клиент-серверные перекодировки наборов символов

Чтобы включить автоматическую перекодировку символов, необходимо сообщить PostgreSQL кодировку, которую вы хотели бы использовать на стороне клиента. Это можно выполнить несколькими способами:

libpq (Раздел 32.10) имеет функции, для управления клиентской кодировкой.

Также, для этой цели можно использовать стандартный синтаксис SQL SET NAMES :

Получить текущую клиентскую кодировку:

Вернуть кодировку по умолчанию:

Если перекодировка определённого символа невозможна (предположим, выбраны EUC_JP для сервера и LATIN1 для клиента, и передаются некоторые японские иероглифы, не представленные в LATIN1 ), возникает ошибка.

23.3.4. Дополнительные источники информации

Рекомендуемые источники для начала изучения различных видов систем кодирования.

Источник

Postgresql кириллица в psql под windows

Важным ограничением, однако, является то, что кодировка каждой базы данных должна быть совместима с параметрами локали базы данных LC_CTYPE (классификация символов) и LC_COLLATE (порядок сортировки строк). Для локали C или POSIX подойдёт любой набор символов, но для других локалей, предоставляемых библиотекой libc, есть только один набор символов, который будет работать правильно. (Однако в среде Windows кодировка UTF-8 может использоваться с любой локалью.) Если у вас включена поддержка ICU, локали, предоставляемые библиотекой ICU, можно использовать с большинством (но не всеми) кодировками на стороне сервера.

23.3.1. Поддерживаемые кодировки

Таблица 23.1. Кодировки PostgreSQL

23.3.2. Настройка кодировки

При создании базы данных можно указать кодировку, отличную от заданной по умолчанию, если эта кодировка совместима с выбранной локалью:

Важно

23.3.3. Автоматическая перекодировка между сервером и клиентом

Таблица 23.2. Клиент-серверные перекодировки наборов символов

Чтобы включить автоматическую перекодировку символов, необходимо сообщить PostgreSQL кодировку, которую вы хотели бы использовать на стороне клиента. Это можно выполнить несколькими способами:

libpq (Раздел 33.10) имеет функции, для управления клиентской кодировкой.

Также, для этой цели можно использовать стандартный синтаксис SQL SET NAMES :

Получить текущую клиентскую кодировку:

Вернуть кодировку по умолчанию:

Если перекодировка определённого символа невозможна (предположим, выбраны EUC_JP для сервера и LATIN1 для клиента, и передаются некоторые японские иероглифы, не представленные в LATIN1 ), возникает ошибка.

23.3.4. Дополнительные источники информации

Рекомендуемые источники для начала изучения различных видов систем кодирования.

Источник

В статье пойдёт речь о том, как добиться корректного вывода кириллицы в «консоли» Windows ( cmd.exe ).

Содержание

Описание проблемы

В дистрибутив PostgreSQL, помимо всего прочего, для работы с СУБД входит:

При работе с psql в среде Windows пользователи всегда довольно часто сталкиваются с проблемой вывода кириллицы. Например, при отображении результатов запроса к таблице, в полях которых хранятся строковые данные на русском языке.

Psql.codepage.fail

Решение проблемы

На сервере имеется БД, созданная в кодировке UTF8.

Значит, надо как-то добиться, чтобы кодировка была одна.

В разных источниках встречаются разные рецепты, включая правку реестра и подмену файлов в системных папках Windows. Ничего этого делать не нужно, достаточно всего трёх шагов:

Конкретные действия

Супер быстро и просто

400px Posgresql console 1251

Быстро и просто

Вводите пароль (если установлен) и выполняете команду:

И всё. Теперь результаты запроса, содержащие кириллицу, будут отображаться нормально. Но есть небольшой косяк:

Psql.codepage.866

Потому предлагаем ещё способ, который этого недостатка лишён.

Посложнее и подольше

Psql.console.font

Всё, теперь кириллица будет нормально отображаться.

Источник

В общем-то, это не сама статья, а только ссылка на неё.

В своё время столкнувшись с проблемой отображения кириллицы в psql под Windows, я был удивлён разнообразием и бесполезностью решений, как это реализовать. В основном, предлагается править реестр и прибегать к иным шаманским приёмам.

На самом деле всё гораздо проще и быстрее, и рассказывается об этом здесь: http://iu5bmstu.ru/index.php?title=PostgreSQL_-_Кириллица_в_psql_под_Windows — это вики-портал одного студенческого сообщества. Опуская вступление и шуточки автора, вся суть находится в разделе Конкретные действия.

Этот пост я написал здесь по рекомендации посетителя, оставившего запись в обсуждении упомянутой страницы.

Понравилась статья? Поделить с друзьями:
  • Яндекс такси как найти чек в приложении
  • Известны стороны треугольника как найти косинус угла
  • Как найти страницу в dle
  • Как найти конфликт ip адресов в сети
  • Как составить график работы салона красоты