Важным ограничением, однако, является то, что кодировка каждой базы данных должна быть совместима с параметрами локали базы данных LC_CTYPE (классификация символов) и LC_COLLATE (порядок сортировки строк). Для локали C или POSIX подойдёт любой набор символов, но для других локалей есть только одна кодировка, которая будет работать правильно. (Однако, в среде Windows кодировка UTF-8 может использоваться с любой локалью.)
23.3.1. Поддерживаемые кодировки
Таблица 23.1 показывает кодировки, доступные для использования в PostgreSQL .
Таблица 23.1. Кодировки PostgreSQL
Имя | Описание | Язык | Поддержка на сервере | Байтов на символ | Псевдонимы |
---|---|---|---|---|---|
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 , так как PostgreSQL не сможет преобразовать или проверить символы, отличные от ASCII.
23.3.2. Настройка кодировки
initdb определяет кодировку по умолчанию для кластера PostgreSQL . Например,
настраивает кодировку по умолчанию на EUC_JP (Расширенная система кодирования для японского языка). Можно использовать —encoding вместо -E в случае предпочтения более длинных имён параметров. Если параметр -E или —encoding не задан, initdb пытается определить подходящую кодировку в зависимости от указанной или заданной по умолчанию локали.
При создании базы данных можно указать кодировку, отличную от заданной по умолчанию, если эта кодировка совместима с выбранной локалью:
Это создаст базу данных с именем korean , которая использует кодировку EUC_KR и локаль ko_KR . Также, получить желаемый результат можно с помощью данной SQL-команды:
Заметьте, что приведённые выше команды задают копирование базы данных template0 . При копировании любой другой базы данных, параметры локали и кодировку исходной базы изменить нельзя, так как это может привести к искажению данных. Более подробное описание приведено в Разделе 22.3.
Кодировка базы данных хранится в системном каталоге pg_database . Её можно увидеть при помощи параметра psql -l или команды l .
Важно
На большинстве современных операционных систем PostgreSQL может определить, какая кодировка подразумевается параметром LC_CTYPE , что обеспечит использование только соответствующей кодировки базы данных. На более старых системах необходимо самостоятельно следить за тем, чтобы использовалась кодировка, соответствующая выбранной языковой среде. Ошибка в этой области, скорее всего, приведёт к странному поведению зависимых от локали операций, таких как сортировка.
PostgreSQL позволит суперпользователям создавать базы данных с кодировкой SQL_ASCII , даже когда значение LC_CTYPE не установлено в C или POSIX . Как было сказано выше, SQL_ASCII не гарантирует, что данные, хранящиеся в базе, имеют определённую кодировку, и таким образом, этот выбор чреват сбоями, связанными с локалью. Использование данной комбинации устарело и, возможно, будет полностью запрещено.
23.3.3. Автоматическая перекодировка между сервером и клиентом
PostgreSQL поддерживает автоматическую перекодировку между сервером и клиентом для определённых комбинаций кодировок. Информация, касающаяся перекодировки, хранится в системном каталоге pg_conversion . PostgreSQL включает в себя некоторые предопределённые кодировки, как показано в Таблице 23.2. Есть возможность создать новую перекодировку при помощи SQL-команды CREATE CONVERSION .
Таблица 23.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 |
Чтобы включить автоматическую перекодировку символов, необходимо сообщить PostgreSQL кодировку, которую вы хотели бы использовать на стороне клиента. Это можно выполнить несколькими способами:
Использование команды encoding в psql . encoding позволяет оперативно изменять клиентскую кодировку. Например, чтобы изменить кодировку на SJIS , введите:
libpq (Раздел 32.10) имеет функции, для управления клиентской кодировкой.
Использование SET client_encoding TO . Клиентская кодировка устанавливается следующей SQL-командой:
Также, для этой цели можно использовать стандартный синтаксис SQL SET NAMES :
Получить текущую клиентскую кодировку:
Вернуть кодировку по умолчанию:
Использование PGCLIENTENCODING . Если установлена переменная окружения PGCLIENTENCODING , то эта клиентская кодировка выбирается автоматически при подключении к серверу. (В дальнейшем это может быть переопределено при помощи любого из методов, указанных выше.)
Использование переменной конфигурации client_encoding. Если задана переменная client_encoding , указанная клиентская кодировка выбирается автоматически при подключении к серверу. (В дальнейшем это может быть переопределено при помощи любого из методов, указанных выше.)
Если перекодировка определённого символа невозможна (предположим, выбраны EUC_JP для сервера и LATIN1 для клиента, и передаются некоторые японские иероглифы, не представленные в LATIN1 ), возникает ошибка.
Если клиентская кодировка определена как SQL_ASCII , перекодировка отключается вне зависимости от кодировки сервера. Что же касается сервера, не стоит использовать SQL_ASCII , если только вы не работаете с данными, которые полностью соответствуют ASCII.
23.3.4. Дополнительные источники информации
Рекомендуемые источники для начала изучения различных видов систем кодирования.
From: | Scott Robertson |
---|---|
To: | pgsql-novice(at)postgresql(dot)org |
Subject: | warning about console code page on starting psql |
Date: | 2014-12-17 04:10:42 |
Message-ID: | 54910242.3090706@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-docs pgsql-novice |
SUMMARY OF PROBLEM: Postgres notes no errors upon installation, but upon
startup of psql there’s a warning; documentation fix doesn’t eliminate
the warning message.
1. psql says this when I log in:
Password for user postgres:
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
2. psql ref. pg. says this:
*Notes for Windows Users*
psql is built as a "console application". Since the Windows console
windows use a different encoding than the rest of the system, you must
take special care when using 8-bit characters within psql. If psql
detects a problematic console code page, it will warn you at startup. To
change the console code page, two things are necessary:
* Set the code page by entering cmd.exe /c chcp 1252. (1252 is a code
page that is appropriate for German; replace it with your value.) If
you are using Cygwin, you can put this command in /etc/profile.
Set the console font to Lucida Console, because the raster font does not
work with the ANSI code page.
3. When I enter "cmd.exe /c chcp 1252" into the command prompt, it says
this:
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:Userszzzzzz>cmd.exe /c chcp 1252
Active code page: 1252
4. Am I supposed to type this at the command prompt: "cmd.exe /c chcp
437"? Because that’s what I did, and now the command prompt says this.
C:Userszzzzzz>cmd.exe /c chcp 437
Active code page: 437
. but I quit and reopened psql, the error message isn’t gone or changed.
5. The instructions to set console font mean nothing to me: "Set the
console font to Lucida Console, because the raster font does not work
with the ANSI code page". Googled it and found nothing that made sense
to me. Set whose console font? PG or Windows? Where and how to set it?
What is a console, anyway? Googled again and again, finally discovered
that the console being referred to is apparently psql itself. By
clicking on the little rectangular icon at the top left of the title bar
of the command prompt (psql), Properties, Font. there it is. "Raster
Fonts" had been selected. I changed this to Lucida Console. Quit psql
and restarted it.
6. psql startup warning has now changed to a different font, no other
change.
7. I changed the console page back to 1252 in the command prompt:
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:>cmd.exe /c chcp 1252
Active code page: 1252
8. Quit and restarted psql (twice). The warning message has not changed.
Is it possible that pg is wrongly detecting code page 437, and does it
matter? I have a lot of work to do and want a sparkling clean foundation
to start from so I don’t have problems later.
—
This email has been checked for viruses by Avast antivirus software.
http://www.avast.com
Responses
- Re: warning about console code page on starting psql at 2014-12-17 05:26:02 from Stephen Cook
- Re: warning about console code page on starting psql at 2014-12-17 05:40:54 from Dav >
From Date Subject Next Message Stephen Cook 2014-12-17 05:26:02 Re: warning about console code page on starting psql Previous Message David G Johnston 2014-12-17 03:35:24 Re: Yet another binary vs. text question (with a twist?)
Browse pgsql-docs by date
From | Date | Subject | |
---|---|---|---|
Next Message | Stephen Cook | 2014-12-17 05:26:02 | Re: warning about console code page on starting psql |
Previous Message | Peter Eisentraut | 2014-12-15 01:08:08 | Re: Documenting timezone setting in initdb |
Copyright © 1996-2020 The PostgreSQL Global Development Group
Using PostgreSQL when I connect to a db using c testdb inside PostgreSQL Database SQL Prompt. I successfully connect to the db but getting the following warning:
What does this warning mean? How to resolve it?
12 Answers 12
psql is built as a "console application". Since the Windows console windows use a different encoding than the rest of the system, you must take special care when using 8-bit characters within psql. If psql detects a problematic console code page, it will warn you at startup.
To change the console code page, two things are necessary: Set the code page by entering cmd.exe /c chcp 1252. (1252 is a code page that is appropriate for German; replace it with your value.) If you are using Cygwin, you can put this command in /etc/profile.
So to remove that warning you need to execute chcp 1252 before you enter psql . Using chcp without parameters gives you the current codepage.
To make it even more obvious, the file to which @user3423801 is adding the line
is in the scripts directory where you installed Postgre.
For example, in my case it is
The default codepage for CMD.exe is different than the default for postgres. To change for CMD.exe using the REGISTRY try this:
- Start -> Run -> regedit
- Go to [HKEY_LOCAL_MACHINESoftwareMicrosoftCommand Processor]
- Add new string value named "Autorun" with value "chcp 1252"
Then reopen CMD.exe
Open cmd.exe and run regedit .
Go to ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor
New a string value named: Autorun and change the value to be chcp 1252
Or you can simply type cmd.exe /c chcp 1252 in the Command Prompt window.
The answer of dvdgsng is correct but with code example is more obviously.
I couldn’t figure out how to set it for Cygwin globally. This seemed to work though in my bash script
The answers above are okay, but don’t mention anywhere that Windows 1252 encoding is good for English language versions of Windows AND the other Western European Languages. This completes the answer for those people who may get confused about the aforementioned application to German language encoding. Yes it works for English without umlauts and other special characters needed for German, Spanish, French, Italian, Romanian, Hungarian, etc.
What is Windows 1252 encoding?
Windows-1252 or CP-1252 (code page 1252) is a single-byte character encoding of the Latin alphabet, used by default in the legacy components of Microsoft Windows for English and some other Western languages (other languages use different default encodings).