Кодовая страница консоли 866 отличается от основной страницы windows 1251 postgresql

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

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

27 августа 2018 г.

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

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

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

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

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

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

psql -d ТвояБД -U ТвойЛогин

psql \! chcp 1251

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

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

psql -d ТвояБД -U ТвойЛогин

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

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

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

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

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

psql -d ТвояБД -U ТвойЛогин

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

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

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

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

Содержание

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

В дистрибутив 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 предупреждает при начале работы:

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Для аудиоформата не установлено значение по умолчанию windows

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

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

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

Кодовая страница консоли 866 отличается от основной страницы windows 1251 postgresql

lc_collate: ru1251
lc_ctype: ru1251
lc_messages: ru1251
lc_monetary: ru1251
lc_numeric: ru1251
lc_time: ru1251
server_encoding: utf8

�� ����� pgsql ���� �������:
https://www.postgresql.org/docs/9.6/static/multibyte.html
An important restriction, however, is that each database’s character set must be compatible with the database’s LC_CTYPE (character classification) and LC_COLLATE (string sort order) locale settings. For C or POSIX locale, any character set is allowed, but for other locales there is only one character set that will work correctly. (On Windows, however, UTF-8 encoding can be used with any locale.)

�������! 26 ��� 18, 20:44����[21606094] �������� | ���������� �������� ����������

Re: ������� Windows — Linix, �������� � ���������� cp1251-utf8 [new]
Melkij
Member

server_encoding ������ ��������, ��� �������-�� � ������������ utf8. �� � ���������� ���� ��������� � linux �����.

26 ��� 18, 20:50����[21606109] �������� | ���������� �������� ����������
Re: ������� Windows — Linix, �������� � ���������� cp1251-utf8 [new]
����� �������
Member

������:
���������: 5

Melkij,
select datname, datcollate, datctype from pg_database ;

SELECT name, setting FROM pg_settings WHERE category

Кодовая страница консоли 866 отличается от основной страницы windows 1251 postgresql

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

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

Таблица 22.1 показывает кодировки, доступные для использования в Postgres Pro .

Таблица 22.1. Кодировки Postgres Pro

Имя Описание Язык Поддержка на сервере Байтов на символ Псевдонимы
BIG5 Big Five Традиционные китайские иероглифы Нет 1-2 WIN950 , Windows950
EUC_CN Extended UNIX Code-CN Упрощённые китайские иероглифы Да 1-3
EUC_JP Extended UNIX Code-JP Японский Да 1-3
EUC_JIS_2004 Extended UNIX Code-JP, JIS X 0213 Японский Да 1-3
EUC_KR Extended UNIX Code-KR Корейский Да 1-3
EUC_TW Extended UNIX Code-TW Традиционные китайские иероглифы, тайваньский Да 1-3
GB18030 Национальный стандарт Китайский Нет 1-4
GBK Расширенный национальный стандарт Упрощённые китайские иероглифы Нет 1-2 WIN936 , Windows936
ISO_8859_5 ISO 8859-5, ECMA 113 Латинский/Кириллица Да 1
ISO_8859_6 ISO 8859-6, ECMA 114 Латинский/Арабский Да 1
ISO_8859_7 ISO 8859-7, ECMA 118 Латинский/Греческий Да 1
ISO_8859_8 ISO 8859-8, ECMA 121 Латинский/Иврит Да 1
JOHAB JOHAB Корейский (Хангыль) Нет 1-3
KOI8R KOI 8-R Кириллица (Русский) Да 1 KOI8
KOI8U KOI 8-U Кириллица (Украинский) Да 1
LATIN1 ISO 8859-1, ECMA 94 Западноевропейские Да 1 ISO88591
LATIN2 ISO 8859-2, ECMA 94 Центральноевропейские Да 1 ISO88592
LATIN3 ISO 8859-3, ECMA 94 Южноевропейские Да 1 ISO88593
LATIN4 ISO 8859-4, ECMA 94 Североевропейские Да 1 ISO88594
LATIN5 ISO 8859-9, ECMA 128 Турецкий Да 1 ISO88599
LATIN6 ISO 8859-10, ECMA 144 Скандинавские Да 1 ISO885910
LATIN7 ISO 8859-13 Балтийские Да 1 ISO885913
LATIN8 ISO 8859-14 Кельтские Да 1 ISO885914
LATIN9 ISO 8859-15 LATIN1 c европейскими языками и диалектами Да 1 ISO885915
LATIN10 ISO 8859-16, ASRO SR 14111 Румынский Да 1 ISO885916
MULE_INTERNAL Внутренний код Mule Мультиязычный редактор Emacs Да 1-4
SJIS Shift JIS Японский Нет 1-2 Mskanji , ShiftJIS , WIN932 , Windows932
SHIFT_JIS_2004 Shift JIS, JIS X 0213 Японский Нет 1-2
SQL_ASCII не указан (см. текст) any Да 1
UHC Унифицированный код Хангыль Корейский Нет 1-2 WIN949 , Windows949
UTF8 Unicode, 8-bit все Да 1-4 Unicode
WIN866 Windows CP866 Кириллица Да 1 ALT
WIN874 Windows CP874 Тайский Да 1
WIN1250 Windows CP1250 Центральноевропейские Да 1
WIN1251 Windows CP1251 Кириллица Да 1 WIN
WIN1252 Windows CP1252 Западноевропейские Да 1
WIN1253 Windows CP1253 Греческий Да 1
WIN1254 Windows CP1254 Турецкий Да 1
WIN1255 Windows CP1255 Иврит Да 1
WIN1256 Windows CP1256 Арабский Да 1
WIN1257 Windows CP1257 Балтийские Да 1
WIN1258 Windows CP1258 Вьетнамский Да 1 ABC , TCVN , TCVN5712 , VSCII

Поведение кодировки SQL_ASCII существенно отличается от других. Когда набором символов сервера является SQL_ASCII , сервер интерпретирует значения от 0 до 127 байт согласно кодировке ASCII, тогда как значения от 128 до 255 воспринимаются как незначимые. Перекодировка не будет выполнена при выборе SQL_ASCII . Таким образом, этот вариант является не столько объявлением того, что используется определённая кодировка, сколько объявлением того, что кодировка игнорируется. В большинстве случаев, если вы работаете с любыми данными, отличными от ASCII, не стоит использовать SQL_ASCII , так как Postgres Pro не сможет преобразовать или проверить символы, отличные от ASCII.

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

initdb определяет кодировку по умолчанию для кластера Postgres Pro . Например,

настраивает кодировку по умолчанию на EUC_JP (Расширенная система кодирования для японского языка). Можно использовать —encoding вместо -E в случае предпочтения более длинных имён параметров. Если параметр -E или —encoding не задан, initdb пытается определить подходящую кодировку в зависимости от указанной или заданной по умолчанию локали.

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

Это создаст базу данных с именем korean , которая использует кодировку EUC_KR и локаль ko_KR . Также, получить желаемый результат можно с помощью данной SQL-команды:

Заметьте, что приведённые выше команды задают копирование базы данных template0 . При копировании любой другой базы данных, параметры локали и кодировку исходной базы изменить нельзя, так как это может привести к искажению данных. Более подробное описание приведено в Разделе 21.3.

Кодировка базы данных хранится в системном каталоге pg_database . Её можно увидеть при помощи параметра psql -l или команды \l .

Важно

На большинстве современных операционных систем Postgres Pro может определить, какая кодировка подразумевается параметром LC_CTYPE , что обеспечит использование только соответствующей кодировки базы данных. На более старых системах необходимо самостоятельно следить за тем, чтобы использовалась кодировка, соответствующая выбранной языковой среде. Ошибка в этой области, скорее всего, приведёт к странному поведению зависимых от локали операций, таких как сортировка.

Postgres Pro позволит суперпользователям создавать базы данных с кодировкой SQL_ASCII , даже когда значение LC_CTYPE не установлено в C или POSIX . Как было сказано выше, SQL_ASCII не гарантирует, что данные, хранящиеся в базе, имеют определённую кодировку, и таким образом, этот выбор чреват сбоями, связанными с локалью. Использование данной комбинации устарело и, возможно, будет полностью запрещено.

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

Postgres Pro поддерживает автоматическую перекодировку между сервером и клиентом для определённых комбинаций кодировок. Информация, касающаяся перекодировки, хранится в системном каталоге pg_conversion . Postgres Pro включает в себя некоторые предопределённые кодировки, как показано в Таблице 22.2. Есть возможность создать новую перекодировку при помощи SQL-команды CREATE CONVERSION .

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

Серверная кодировка Доступные клиентские кодировки
BIG5 не поддерживается как серверная кодировка
EUC_CN EUC_CN , MULE_INTERNAL , UTF8
EUC_JP EUC_JP , MULE_INTERNAL , SJIS , UTF8
EUC_JIS_2004 EUC_JIS_2004 , SHIFT_JIS_2004 , UTF8
EUC_KR EUC_KR , MULE_INTERNAL , UTF8
EUC_TW EUC_TW , BIG5 , MULE_INTERNAL , UTF8
GB18030 не поддерживается как серверная кодировка
GBK не поддерживается как серверная кодировка
ISO_8859_5 ISO_8859_5 , KOI8R , MULE_INTERNAL , UTF8 , WIN866 , WIN1251
ISO_8859_6 ISO_8859_6 , UTF8
ISO_8859_7 ISO_8859_7 , UTF8
ISO_8859_8 ISO_8859_8 , UTF8
JOHAB не поддерживается как серверная кодировка
KOI8R KOI8R , ISO_8859_5 , MULE_INTERNAL , UTF8 , WIN866 , WIN1251
KOI8U KOI8U , UTF8
LATIN1 LATIN1 , MULE_INTERNAL , UTF8
LATIN2 LATIN2 , MULE_INTERNAL , UTF8 , WIN1250
LATIN3 LATIN3 , MULE_INTERNAL , UTF8
LATIN4 LATIN4 , MULE_INTERNAL , UTF8
LATIN5 LATIN5 , UTF8
LATIN6 LATIN6 , UTF8
LATIN7 LATIN7 , UTF8
LATIN8 LATIN8 , UTF8
LATIN9 LATIN9 , UTF8
LATIN10 LATIN10 , UTF8
MULE_INTERNAL MULE_INTERNAL , BIG5 , EUC_CN , EUC_JP , EUC_KR , EUC_TW , ISO_8859_5 , KOI8R , LATIN1 to LATIN4 , SJIS , WIN866 , WIN1250 , WIN1251
SJIS не поддерживается как серверная кодировка
SHIFT_JIS_2004 не поддерживается как серверная кодировка
SQL_ASCII любая (перекодировка не будет выполнена)
UHC не поддерживается как серверная кодировка
UTF8 все поддерживаемые кодировки
WIN866 WIN866 , ISO_8859_5 , KOI8R , MULE_INTERNAL , UTF8 , WIN1251
WIN874 WIN874 , UTF8
WIN1250 WIN1250 , LATIN2 , MULE_INTERNAL , UTF8
WIN1251 WIN1251 , ISO_8859_5 , KOI8R , MULE_INTERNAL , UTF8 , WIN866
WIN1252 WIN1252 , UTF8
WIN1253 WIN1253 , UTF8
WIN1254 WIN1254 , UTF8
WIN1255 WIN1255 , UTF8
WIN1256 WIN1256 , UTF8
WIN1257 WIN1257 , UTF8
WIN1258 WIN1258 , UTF8

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

Использование команды \encoding в psql . \encoding позволяет оперативно изменять клиентскую кодировку. Например, чтобы изменить кодировку на SJIS , введите:

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

Использование SET client_encoding TO . Клиентская кодировка устанавливается следующей SQL-командой:

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

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

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

Использование PGCLIENTENCODING . Если установлена переменная окружения PGCLIENTENCODING , то эта клиентская кодировка выбирается автоматически при подключении к серверу. (В дальнейшем это может быть переопределено при помощи любого из методов, указанных выше.)

Использование переменной конфигурации client_encoding. Если задана переменная client_encoding , указанная клиентская кодировка выбирается автоматически при подключении к серверу. (В дальнейшем это может быть переопределено при помощи любого из методов, указанных выше.)

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

Если клиентская кодировка определена как SQL_ASCII , перекодировка отключается вне зависимости от кодировки сервера. Что же касается сервера, не стоит использовать SQL_ASCII , если только вы не работаете с данными, которые полностью соответствуют ASCII.

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

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

Оцените статью
Adblock
detector