Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана — студенческое сообщество
В статье пойдёт речь о том, как добиться корректного вывода кириллицы в «консоли» Windows (cmd.exe
).
Содержание
- 1 Описание проблемы
- 2 Решение проблемы
- 2.1 Суть
- 2.2 Конкретные действия
- 2.2.1 Супер быстро и просто
- 2.2.2 Быстро и просто
- 2.2.3 Посложнее и подольше
Описание проблемы
В дистрибутив PostgreSQL, помимо всего прочего, для работы с СУБД входит:
- приложение с графическим интерфейсом
pgAdmin
; - консольная утилита
psql
.
При работе с psql
в среде Windows пользователи всегда довольно часто сталкиваются с проблемой вывода кириллицы. Например, при отображении результатов запроса к таблице, в полях которых хранятся строковые данные на русском языке.
Ну и зачем тогда работать с 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. Ничего этого делать не нужно, достаточно всего трёх шагов:
- сменить шрифт у
cmd.exe
; - сменить текущую кодовую страницу
cmd.exe
; - сменить кодировку на стороне клиента в
psql
.
Конкретные действия
Супер быстро и просто
Запускаете cmd.exe
, оттуда psql
:
psql -d ВАШАБАЗА -U ВАШЛОГИН
Далее:
psql ! chcp 1251
Быстро и просто
Запускаете cmd.exe
, оттуда psql
:
psql -d ВАШАБАЗА -U ВАШЛОГИН
Вводите пароль (если установлен) и выполняете команду:
set client_encoding='WIN866';
И всё. Теперь результаты запроса, содержащие кириллицу, будут отображаться нормально. Но есть небольшой косяк:
Потому предлагаем ещё способ, который этого недостатка лишён.
Посложнее и подольше
Запустить cmd.exe
, нажать мышью в правом левом верхнем углу окна, там Свойства — Шрифт — выбрать Lucida Console. Нажать ОК.
Выполнить команду:
chcp 1251
В ответ выведет:
Текущая кодовая страница: 1251
Запустить psql
;
psql -d ВАШАБАЗА -U ВАШЛОГИН
Кстати, обратите внимание — теперь предупреждения о несовпадении кодировок нет.
Выполнить:
set client_encoding='win1251';
Он выведет:
SET
Всё, теперь кириллица будет нормально отображаться.
Проверяем:
12 / 11 / 5 Регистрация: 21.08.2012 Сообщений: 226 |
|
1 |
|
03.03.2022, 13:21. Показов 2755. Ответов 2
Доброго времени суток. При восстановлении базы данных из дампа в сообщениях лога нарушается кодировка — часть текста выводится знаком вопроса. Если база успешно восстанавливается, то это не страшно. Но вот восстановление базы postgres_air завершается с ошибкой, а какая ошибка — понять невозможно. Основной вопрос — как настроить PgAdmin так, чтобы текст в логах стал читаемым. Версия PgAdmin: 6.4 P.S. Если кому интересно: Добавлено через 2 часа 52 минуты Кликните здесь для просмотра всего текста
PID Пользователь Приложение Клиент Серверный процесс запущен Состояние Wait event Блокирующие PID C:Program FilesPostgreSQL14binpg_restore.exe —host «localhost» —port «5432» —username «postgres» —no-password —dbname «postgres_air» —section=pre-data —section=data —section=post-data —clean —verbose «D:\Books\Database\Другие СУБД\PostgreSQL\Домбровская. Оптимизация запросов PostgreSQL\postgres_air.backup» . . . pg_restore: ???????? FK CONSTRAINT «postgres_air.boarding_pass passenger_id_fk»
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,859 |
|
04.03.2022, 00:32 |
2 |
попробуйье туже самую команду из консоли windows, поигравшись с кодировками перед запуском pg_restore
1 |
12 / 11 / 5 Регистрация: 21.08.2012 Сообщений: 226 |
|
04.03.2022, 08:30 [ТС] |
3 |
grgdvo Последовал Вашему совету и запустил из командной строки FARа. Все сообщения отобразились корректно. Мало того, похоже база полностью загрузилась. Строк с числом 66 в конце вообще не вывело. И без всяких игр с кодировками. Проблема с кодировкой в PgAdmin не решена, но обходной путь найден.
0 |
I have installed postgreSQL.
I use pgAdminIII as admin panel.
I am trying to watch tables content and see following:
How to avoid encoding problem?
Daniel Vérité
57.4k15 gold badges127 silver badges152 bronze badges
asked Oct 4, 2014 at 11:16
5
For a UTF8 database, pgAdmin should always display strings correctly. The most likely explanation is that the data itself is incorrect.
This generally happens when a client application sends data in a format which doesn’t match its client_encoding
setting. If this is the case, setting client_encoding
correctly would prevent this from happening (provided the client application’s code page is supported by Postgres). This wouldn’t fix the existing data, but it might be possible to repair it with the convert
function.
answered Oct 4, 2014 at 12:39
Nick BarnesNick Barnes
19.4k3 gold badges51 silver badges63 bronze badges
5
В логах периодически появляются сообщения в кракозябре. Не всегда. Обычно сообщения на русском отображаются нормально. Такая же проблема с кодировкой в pgAdmin, например, при попытке выполнить запрос с ошибкой в синтаксисе.
При установке и клиент и сервер выставлялся с кодировкой Win1251
Вот кусок лога:
2009-03-29 19:34:03 ALMT LOG: система была отключена: 2009-03-29 19:31:54 ALMT
2009-03-29 19:34:03 ALMT LOG: loaded library «$libdir/plugins/plugin_debugger.dll»
2009-03-29 19:34:03 ALMT FATAL: система баз данных стартует
2009-03-29 19:34:03 ALMT LOG: database system is ready to accept connections
2009-03-29 19:34:03 ALMT LOG: autovacuum launcher started
2009-03-29 19:34:04 ALMT LOG: loaded library «$libdir/plugins/plugin_debugger.dll»
2009-03-29 19:34:53 ALMT LOG: loaded library «$libdir/plugins/plugin_debugger.dll»
2009-03-29 19:34:54 ALMT NOTICE: нет транзакции в процессе выполнения
2009-03-29 19:34:54 ALMT LOG: loaded library «$libdir/plugins/plugin_debugger.dll»
2009-03-29 19:34:54 ALMT NOTICE: нет транзакции в процессе выполнения
2009-03-29 19:34:58 ALMT NOTICE: нет транзакции в процессе выполнения
2009-03-29 19:35:29 ALMT NOTICE: нет транзакции в процессе выполнения
2009-03-29 19:35:30 ALMT NOTICE: нет транзакции в процессе выполнения
Вот. А последняя ошибка очень интересует.
Что тут можно предпринять?
Спасибо.
ОС: XP Pro. Postgres версии 8.3.
I have a PostgreSQL on Windows 7 machine. And here my data base script:
CREATE DATABASE usersdb
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'Russian_Russia.1251'
LC_CTYPE = 'Russian_Russia.1251'
CONNECTION LIMIT = -1;
My problem in that i see unreadable error in Jetty/Tomcat:
Caused by: org.postgresql.util.PSQLException: ?????: ???????????? "test_user" ?? ?????? ???????? ??????????? (?? ??????)
I try create new db in pgAdmin but there are only LC_COLLATE = ‘Russian_Russia.1251’ and LC_CTYPE = ‘Russian_Russia.1251’ i can chose.
How can i solve this problem?
asked Aug 28, 2013 at 8:02
Kliver MaxKliver Max
5,06622 gold badges95 silver badges148 bronze badges
1
The first place to look, of course, are in the PostgreSQL logs. Those may be better handled than your Jetty/Tomcat instance.
The second question is what client encoding is set. You may want to (via jdbc):
show client_encoding;
Finally lc_messages may need to be adjusted.
answered Nov 12, 2013 at 1:57
Chris TraversChris Travers
25.2k6 gold badges63 silver badges181 bronze badges