Материал из Кафедра ИУ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
Всё, теперь кириллица будет нормально отображаться.
Проверяем:
Работаю в 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=
Список баз с кодировками и локалями там же:
Какие манипуляции делала с уже готовым дампом:
Восстанавливаю данные из дампа в предварительно созданную базу
$ 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 — дамп такой же базы, созданной в убунту, с такой же таблицей, но всего одной записью
Содержание
- Postgresql кириллица в psql под windows
- Комментарии
- Я тоже удивлён, что люди не
- И вы-таки правы. Даже
- А это потому, что локализация
- Нестареющий совет о чтении
- Призрак Басенджи
- 27 августа 2018 г.
- PostgreSQL. Кириллица в psql под Windows
- Описание проблемы
- Решение проблемы
- Конкретные действия
- Очень быстро и просто
- Быстро и просто
- Посложнее и подольше
- Postgresql кириллица в psql под windows
- 23.3.1. Поддерживаемые кодировки
- 23.3.2. Настройка кодировки
- Важно
- 23.3.3. Автоматическая перекодировка между сервером и клиентом
- 23.3.4. Дополнительные источники информации
- Postgresql кириллица в psql под windows
- 23.3.1. Поддерживаемые кодировки
- 23.3.2. Настройка кодировки
- Важно
- 23.3.3. Автоматическая перекодировка между сервером и клиентом
- 23.3.4. Дополнительные источники информации
- Содержание
- Описание проблемы
- Решение проблемы
- Конкретные действия
- Супер быстро и просто
- Быстро и просто
- Посложнее и подольше
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.
Описание проблемы
Решение проблемы
Конкретные действия
Очень быстро и просто
Быстро и просто
Запускаем cmd.exe, оттуда psql:
Вводим пароль (если установлен) и выполняем следующую команду:
И все. Теперь результаты запроса, содержащие кириллицу, будут отображаться нормально. Но есть небольшой косяк:
Посложнее и подольше
Текущая кодовая страница: 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 пользователи всегда довольно часто сталкиваются с проблемой вывода кириллицы. Например, при отображении результатов запроса к таблице, в полях которых хранятся строковые данные на русском языке.
Решение проблемы
На сервере имеется БД, созданная в кодировке UTF8.
Значит, надо как-то добиться, чтобы кодировка была одна.
В разных источниках встречаются разные рецепты, включая правку реестра и подмену файлов в системных папках Windows. Ничего этого делать не нужно, достаточно всего трёх шагов:
Конкретные действия
Супер быстро и просто
Быстро и просто
Вводите пароль (если установлен) и выполняете команду:
И всё. Теперь результаты запроса, содержащие кириллицу, будут отображаться нормально. Но есть небольшой косяк:
Потому предлагаем ещё способ, который этого недостатка лишён.
Посложнее и подольше
Всё, теперь кириллица будет нормально отображаться.
Источник
В общем-то, это не сама статья, а только ссылка на неё.
В своё время столкнувшись с проблемой отображения кириллицы в psql под Windows, я был удивлён разнообразием и бесполезностью решений, как это реализовать. В основном, предлагается править реестр и прибегать к иным шаманским приёмам.
На самом деле всё гораздо проще и быстрее, и рассказывается об этом здесь: http://iu5bmstu.ru/index.php?title=PostgreSQL_-_Кириллица_в_psql_под_Windows — это вики-портал одного студенческого сообщества. Опуская вступление и шуточки автора, вся суть находится в разделе Конкретные действия.
Этот пост я написал здесь по рекомендации посетителя, оставившего запись в обсуждении упомянутой страницы.