Перейти к основному содержимому

Поддержка кодировок

примечание

Эта страница переведена при помощи нейросети GigaChat.

Поддержка наборов символов в PostgreSQL позволяет хранить текст в различных кодировках, включая однобайтовые (например, серии ISO 8859) и многобайтовые (EUC, UTF-8, внутренний код Mule). Все поддерживаемые кодировки прозрачно работают с клиентами, но не все подходят для внутреннего использования на сервере. Кодировка по умолчанию задается при инициализации кластера PostgreSQL с помощью initdb, но ее можно переопределить при создании базы данных, позволяя иметь несколько баз с разной кодировкой.

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

Поддерживаемые наборы символов

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

Наборы символов PostgreSQL:

ИмяОписаниеЯзыкСервер?ICU?Байт / СимволПсевдонимы
BIG5Большая пятеркаТрадиционный китайскийНетНет1-2WIN950, Windows950
EUC_CNРасширенный код Юникода-CNУпростите китайскийДаДа1-3 
EUC_JPРасширенный код Юникода для японского языкаЯпонскийДаДа1-3 
EUC_JIS_2004Расширенный код Юникода для Японии, JIS X 0213ЯпонскийДаНет1--3 
EUC_KRРасширенный код Юникода-KRКорейскийДаДа1-3 
EUC_TWРасширенный код Юникода-TWТрадиционный китайский, тайваньскийДаДа1-3 
GB18030Национальный стандартКитайскийНетНет1-4 
GBKРасширенный национальный стандартУпростить китайскийНетНет1--2WIN936, Windows936
ISO_8859_5ISO 8859-5, ECMA 113Латиница/КириллицаДаДа1 
ISO_8859_6ISO 8859-6, ЭМА 114Латиница/АрабскийДаДа1 
ISO_8859_7ISO 8859-7, ЭМА 118Латинский/греческийДаДа1 
ISO_8859_8ISO 8859-8, ECMA 121Латиница / ИвритДаДа1 
JOHABJOHABКорейский (Хангыль)НетНет1-3 
KOI8RКОИ8-РКириллица (русский)ДаДа1KOI8
KOI8UКОИ8-УНе люблю менять тему разговора, но вот сейчас тот самый случай.ДаДа1 
LATIN1ISO 8859-1, ECMA 94ЗападноевропейскийДаДа1ISO88591
LATIN2ISO 8859-2, ECMA 94ЦентральноевропейскийДаДа1ISO88592
LATIN3ISO 8859-3, ECMA 94ЮжноевропейскийДаДа1ISO88593
LATIN4ISO 8859-4, ECMA 94Северная ЕвропаДаДа1ISO88594
LATIN5ISO 8859-9, ECMA 128ТурецкийДаДа1ISO88599
LATIN6ISO 8859-10, ECMA 144СкандинавскийДаДа1ISO885910
LATIN7ISO 8859-13БалтийскиеДаДа1ISO885913
LATIN8ISO 8859-14КельтскийДаДа1ISO885914
LATIN9ISO 8859-15ЛАТИНСКИЙ1 с Евро и акцентамиДаДа1ISO885915
LATIN10ISO 8859-16, ASRO SR 14111РумынскийДаНет1ISO885916
MULE_INTERNALВнутренний код мулаМногоязычный ЭмаксДаНет1-4 
SJISShift JISЯпонскийНетНет1-2Mskanji, ShiftJIS, WIN932, Windows932
SHIFT_JIS_2004Shift JIS, JIS X 0213ЯпонскийНетНет1-2 
SQL_ASCIIне указано (см. текст)любоеДаНет1 
UHCУнифицированный код хангыляКорейскийНетНет1-2WIN949, Windows949
UTF8Юникод, 8 битвсеДаДа1-4Unicode
WIN866Windows CP866КириллицаДаДа1ALT
WIN874Windows CP874ТайскийДаНет1 
WIN1250Windows CP1250ЦентральноевропейскийДаДа1 
WIN1251Windows CP1251КириллицаДаДа1WIN
WIN1252Windows CP1252ЗападноевропейскийДаДа1 
WIN1253Windows CP1253ГреческийДаДа1 
WIN1254Windows CP1254ТурецкийДаДа1 
WIN1255Windows CP1255ИвритДаДа1 
WIN1256Windows CP1256АрабскийДаДа1 
WIN1257Кодировка Windows CP1257БалтийскийДаДа1 
WIN1258Кодировка Windows CP1258ВьетнамскийДаДа1ABC, TCVN, TCVN5712, VSCII

Не все клиентские API поддерживают полный перечень заявленных кодировок. Например, драйвер PostgreSQL JDBC не поддерживает кодировки MULE_INTERNAL, LATIN6, LATIN8 и LATIN10.

Особенностью кодировки SQL_ASCII является ее особое поведение. При выборе серверной кодировки SQL_ASCII сервер интерпретирует байты от 0 до 127 как символы ASCII, а байты от 128 до 255 не интерпретирует вовсе. При использовании SQL_ASCII преобразование кодировок не выполняется. Фактически, эта настройка означает, что реальная кодировка неизвестна, а не задает конкретную кодировку. Чаще всего, если в данных содержатся символы, отличные от ASCII, использовать SQL_ASCII неэффективно, так как PostgreSQL не сможет оказывать помощь в преобразовании или проверке не-ASCII-символов.

Установка набора символов

Инструмент initdb устанавливает набор символов (кодировку) по умолчанию для кластера PostgreSQL. Например:

initdb -E EUC_JP

определяет набор символов по умолчанию как EUC_JP (расширенный юникод-код для японского языка). Альтернативно можно использовать длинную форму параметра --encoding.

Если не указаны параметры -E или --encoding, initdb автоматически выберет подходящую кодировку на основе текущей локали.

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

createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean

Или эквивалентная команда SQL:

CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;

Эти команды создают базу данных с именем korean, использующую кодировку EUC_KR и локаль ko_KR. Обратите внимание, что здесь указано копирование из базы данных template0. При копировании любой другой базы данных параметры кодировки и локали должны совпадать с оригиналом, иначе это приведет к повреждению данных.

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

$ psql -l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access Privileges
-----------+----------+-----------+-------------+-------------+-------------------------------------
clocaledb | hlinnaka | SQL_ASCII | C | C |
englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 |
japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 |
korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr |
postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 |
template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka}
template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka}
(7 rows)

Важно

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

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

Автоматическое преобразование набора символов между сервером и клиентом

PostgreSQL поддерживает автоматическое преобразование наборов символов между сервером и клиентом для многих комбинаций кодировок (см. раздел Доступные преобразования набора символов для списка поддерживаемых преобразований).

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

  • Через команду \encoding в интерактивной оболочке psql. Например, для изменения кодировки на SJIS выполните:

    \encoding SJIS
  • С помощью функций библиотеки libpq (см. раздел Функции управления) для управления кодировкой клиента.

  • Путем использования команды SQL SET client_encoding TO. Например, для установки кодировки клиента на UTF8 выполните:

    SET client_encoding TO 'UTF8';
    SET CLIENT_ENCODING TO 'value';

    Можно использовать стандартную синтаксис SQL SET NAMES для этой цели:

    SET NAMES 'value';

    Чтобы запросить текущую кодировку клиента:

    SHOW client_encoding;

    Чтобы вернуться к кодировке по умолчанию:

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

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

Если невозможно преобразовать определенный символ — например, при использовании кодировки сервера EUC_JP и клиентской кодировки LATIN1, где некоторые японские символы не имеют аналогов в LATIN1 — выдается ошибка.

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

Доступные преобразования набора символов

PostgreSQL позволяет выполнять преобразование между любыми двумя наборами символов, для которых существует соответствующая функция в системном каталоге pg_conversion. Postgres поставляется с некоторым количеством предопределенных преобразований, кратко описанных в таблице «Встроенные преобразования набора символов клиент/сервер» и подробно представленных в таблице «Все встроенные преобразования наборов символов». Добавить новое преобразование можно с помощью команды SQL CREATE CONVERSION. (Чтобы использовать преобразование автоматически при обмене данными между клиентом и сервером, оно должно быть отмечено как «по умолчанию» для данной пары наборов символов.)

Встроенные преобразования набора символов клиент/сервер:

Серверный набор символовДоступные наборы символов клиента
BIG5не поддерживается в качестве кодировки сервера
EUC_CNEUC_CN, MULE_INTERNAL, UTF8
EUC_JPEUC_JP, MULE_INTERNAL, SJIS, UTF8
EUC_JIS_2004EUC_JIS_2004, SHIFT_JIS_2004, UTF8
EUC_KREUC_KR, MULE_INTERNAL, UTF8
EUC_TWEUC_TW, BIG5, MULE_INTERNAL, UTF8
GB18030не поддерживается в качестве кодировки сервера
GBKне поддерживается в качестве кодировки сервера
ISO_8859_5ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866, WIN1251
ISO_8859_6ISO_8859_6, UTF8
ISO_8859_7ISO_8859_7, UTF8
ISO_8859_8ISO_8859_8, UTF8
JOHABне поддерживается в качестве кодировки сервера
KOI8RKOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
KOI8UKOI8U, UTF8
LATIN1LATIN1, MULE_INTERNAL, UTF8
LATIN2LATIN2, MULE_INTERNAL, UTF8, WIN1250
LATIN3LATIN3, MULE_INTERNAL, UTF8
LATIN4LATIN4, MULE_INTERNAL, UTF8
LATIN5LATIN5, UTF8
LATIN6LATIN6, UTF8
LATIN7LATIN7, UTF8
LATIN8LATIN8, UTF8
LATIN9LATIN9, UTF8
LATIN10LATIN10, UTF8
MULE_INTERNALMULE_INTERNAL, BIG5, EUC_CN, EUC_JP, EUC_KR, EUC_TW, ISO_8859_5, KOI8R, LATIN1 до LATIN4, SJIS, WIN866, WIN1250, WIN1251
SJISне поддерживается в качестве кодировки сервера
SHIFT_JIS_2004не поддерживается в качестве кодировки сервера
SQL_ASCIIлюбая (преобразование не будет выполнено)
UHCне поддерживается в качестве кодировки сервера
UTF8все поддерживаемые кодировки
WIN866WIN866, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN1251
WIN874WIN874, UTF8
WIN1250WIN1250, LATIN2, MULE_INTERNAL, UTF8
WIN1251WIN1251, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866
WIN1252WIN1252, UTF8
WIN1253WIN1253, UTF8
WIN1254WIN1254, UTF8
WIN1255WIN1255, UTF8
WIN1256WIN1256, UTF8
WIN1257WIN1257, UTF8
WIN1258WIN1258, UTF8

Все встроенные преобразования наборов символов:

Имя преобразованияИсходная кодировкаКонечная кодировка
big5_to_euc_twBIG5EUC_TW
big5_to_micBIG5MULE_INTERNAL
big5_to_utf8BIG5UTF8
euc_cn_to_micEUC_CNMULE_INTERNAL
euc_cn_to_utf8EUC_CNUTF8
euc_jp_to_micEUC_JPMULE_INTERNAL
euc_jp_to_sjisEUC_JPSJIS
euc_jp_to_utf8EUC_JPUTF8
euc_kr_to_micEUC_KRMULE_INTERNAL
euc_kr_to_utf8EUC_KRUTF8
euc_tw_to_big5EUC_TWBIG5
euc_tw_to_micEUC_TWMULE_INTERNAL
euc_tw_to_utf8EUC_TWUTF8
gb18030_to_utf8GB18030UTF8
gbk_to_utf8GBKUTF8
iso_8859_10_to_utf8LATIN6UTF8
iso_8859_13_to_utf8LATIN7UTF8
iso_8859_14_to_utf8LATIN8UTF8
iso_8859_15_to_utf8LATIN9UTF8
iso_8859_16_to_utf8LATIN10UTF8
iso_8859_1_to_micLATIN1MULE_INTERNAL
iso_8859_1_to_utf8LATIN1UTF8
iso_8859_2_to_micLATIN2MULE_INTERNAL
iso_8859_2_to_utf8LATIN2UTF8
iso_8859_2_to_windows_1250LATIN2WIN1250
iso_8859_3_to_micLATIN3MULE_INTERNAL
iso_8859_3_to_utf8LATIN3UTF8
iso_8859_4_to_micLATIN4MULE_INTERNAL
iso_8859_4_to_utf8LATIN4UTF8
iso_8859_5_to_koi8_rISO_8859_5KOI8R
iso_8859_5_to_micISO_8859_5MULE_INTERNAL
iso_8859_5_to_utf8ISO_8859_5UTF8
iso_8859_5_to_windows_1251ISO_8859_5WIN1251
iso_8859_5_to_windows_866ISO_8859_5WIN866
iso_8859_6_to_utf8ISO_8859_6UTF8
iso_8859_7_to_utf8ISO_8859_7UTF8
iso_8859_8_to_utf8ISO_8859_8UTF8
iso_8859_9_to_utf8LATIN5UTF8
johab_to_utf8JOHABUTF8
koi8_r_to_iso_8859_5KOI8RISO_8859_5
koi8_r_to_micKOI8RMULE_INTERNAL
koi8_r_to_utf8KOI8RUTF8
koi8_r_to_windows_1251KOI8RWIN1251
koi8_r_to_windows_866KOI8RWIN866
koi8_u_to_utf8KOI8UUTF8
mic_to_big5MULE_INTERNALBIG5
mic_to_euc_cnMULE_INTERNALEUC_CN
mic_to_euc_jpMULE_INTERNALEUC_JP
mic_to_euc_krMULE_INTERNALEUC_KR
mic_to_euc_twMULE_INTERNALEUC_TW
mic_to_iso_8859_1MULE_INTERNALLATIN1
mic_to_iso_8859_2MULE_INTERNALLATIN2
mic_to_iso_8859_3MULE_INTERNALLATIN3
mic_to_iso_8859_4MULE_INTERNALLATIN4
mic_to_iso_8859_5MULE_INTERNALISO_8859_5
mic_to_koi8_rMULE_INTERNALKOI8R
mic_to_sjisMULE_INTERNALSJIS
mic_to_windows_1250MULE_INTERNALWIN1250
mic_to_windows_1251MULE_INTERNALWIN1251
mic_to_windows_866MULE_INTERNALWIN866
sjis_to_euc_jpSJISEUC_JP
sjis_to_micSJISMULE_INTERNAL
sjis_to_utf8SJISUTF8
windows_1258_to_utf8WIN1258UTF8
uhc_to_utf8UHCUTF8
utf8_to_big5UTF8BIG5
utf8_to_euc_cnUTF8EUC_CN
utf8_to_euc_jpUTF8EUC_JP
utf8_to_euc_krUTF8EUC_KR
utf8_to_euc_twUTF8EUC_TW
utf8_to_gb18030UTF8GB18030
utf8_to_gbkUTF8GBK
utf8_to_iso_8859_1UTF8LATIN1
utf8_to_iso_8859_10UTF8LATIN6
utf8_to_iso_8859_13UTF8LATIN7
utf8_to_iso_8859_14UTF8LATIN8
utf8_to_iso_8859_15UTF8LATIN9
utf8_to_iso_8859_16UTF8LATIN10
utf8_to_iso_8859_2UTF8LATIN2
utf8_to_iso_8859_3UTF8LATIN3
utf8_to_iso_8859_4UTF8LATIN4
utf8_to_iso_8859_5UTF8ISO_8859_5
utf8_to_iso_8859_6UTF8ISO_8859_6
utf8_to_iso_8859_7UTF8ISO_8859_7
utf8_to_iso_8859_8UTF8ISO_8859_8
utf8_to_iso_8859_9UTF8LATIN5
utf8_to_johabUTF8JOHAB
utf8_to_koi8_rUTF8KOI8R
utf8_to_koi8_uUTF8KOI8U
utf8_to_sjisUTF8SJIS
utf8_to_windows_1258UTF8WIN1258
utf8_to_uhcUTF8UHC
utf8_to_windows_1250UTF8WIN1250
utf8_to_windows_1251UTF8WIN1251
utf8_to_windows_1252UTF8WIN1252
utf8_to_windows_1253UTF8WIN1253
utf8_to_windows_1254UTF8WIN1254
utf8_to_windows_1255UTF8WIN1255
utf8_to_windows_1256UTF8WIN1256
utf8_to_windows_1257UTF8WIN1257
utf8_to_windows_866UTF8WIN866
utf8_to_windows_874UTF8WIN874
windows_1250_to_iso_8859_2WIN1250LATIN2
windows_1250_to_micWIN1250MULE_INTERNAL
windows_1250_to_utf8WIN1250UTF8
windows_1251_to_iso_8859_5WIN1251ISO_8859_5
windows_1251_to_koi8_rWIN1251KOI8R
windows_1251_to_micWIN1251MULE_INTERNAL
windows_1251_to_utf8WIN1251UTF8
windows_1251_to_windows_866WIN1251WIN866
windows_1252_to_utf8WIN1252UTF8
windows_1256_to_utf8WIN1256UTF8
windows_866_to_iso_8859_5WIN866ISO_8859_5
windows_866_to_koi8_rWIN866KOI8R
windows_866_to_micWIN866MULE_INTERNAL
windows_866_to_utf8WIN866UTF8
windows_866_to_windows_1251WIN866WIN
windows_874_to_utf8WIN874UTF8
euc_jis_2004_to_utf8EUC_JIS_2004UTF8
utf8_to_euc_jis_2004UTF8EUC_JIS_2004
shift_jis_2004_to_utf8SHIFT_JIS_2004UTF8
utf8_to_shift_jis_2004UTF8SHIFT_JIS_2004
euc_jis_2004_to_shift_jis_2004EUC_JIS_2004SHIFT_JIS_2004
shift_jis_2004_to_euc_jis_2004SHIFT_JIS_2004EUC_JIS_2004

Имена преобразования следуют стандартной схеме именования: официальное название исходной кодировки со всеми неалфавитно-цифровыми символами, замененными подчеркиваниями, за которыми следует _to_, а затем аналогично обработанное имя целевой кодировки. Поэтому эти имена иногда отклоняются от обычных имен кодировок, показанных в таблице «Наборы символов PostgreSQL».

Дополнительная литература

Эти материалы помогут разобраться в различных системах кодирования:

  • Обработка информации CJKV: вычисления на китайском, японском, корейском и вьетнамском языках

    Книга подробно объясняет стандарты кодирования EUC_JP, EUC_CN, EUC_KR, EUC_TW.

  • Веб-сайт консорциума Юникод

    Официальный ресурс, посвященный вопросам интернационализации и поддержке множества письменностей и языков.

  • RFC 3629

    Документ, определяющий формат UTF-8 (8-битное представление Юникода).