22.3. Поддержка набора символов#

22.3. Поддержка набора символов

22.3. Поддержка набора символов #

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

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

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

Таблица 22.3 показывает наборы символов, доступные для использования в Tantor SE-1C.

Таблица 22.3. Tantor SE-1C Наборы символов

ИмяОписаниеЯзыкСервер?ICU?Байты/​СимволПсевдонимы
BIG5Big FiveТрадиционный китайскийНетНет1–2WIN950, Windows950
EUC_CNРасширенный UNIX-код-КНУпрощенный китайскийДаДа1–3 
EUC_JPРасширенный UNIX-код-JPЯпонскийДаДа1–3 
EUC_JIS_2004Расширенный UNIX-код-JP, JIS X 0213ЯпонскийДаНет1–3 
EUC_KRРасширенный UNIX-код-КРКорейскийДаДа1–3 
EUC_TWРасширенный UNIX Код-TWТрадиционный китайский, ТайваньскийДаДа1–4 
GB18030Национальный стандартКитайскийНетНет1–4 
GBKРасширенный национальный стандартУпрощенный китайскийНетНет1–2WIN936, Windows936
ISO_8859_5ISO 8859-5, ECMA 113Латиница/КириллицаДаДа1 
ISO_8859_6ISO 8859-6, ECMA 114Латиница/арабицаДаДа1 
ISO_8859_7ISO 8859-7, ECMA 118Латиница/ГреческийДаДа1 
ISO_8859_8ISO 8859-8, ECMA 121Латиница/ИвритДаДа1 
JOHABJOHABКорейский (Хангыль)НетНет1–3 
KOI8RKOI8-RКириллица (Русский)ДаДа1KOI8
KOI8UKOI8-UКириллица (украинский)ДаДа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-13BalticДаДа1ISO885913
LATIN8ISO 8859-14CelticДаДа1ISO885914
LATIN9ISO 8859-15LATIN1 с Евро и акцентамиДаДа1ISO885915
LATIN10ISO 8859-16, ASRO SR 14111RomanianДаНет1ISO885916
MULE_INTERNALВнутренний код MuleМногоязычный EmacsДаНет1–4 
SJISShift JISЯпонскийНетНет1–2Mskanji, ShiftJIS, WIN932, Windows932
SHIFT_JIS_2004Shift JIS, JIS X 0213ЯпонскийНетНет1–2 
SQL_ASCIIне указано (см. текст)любойДаНет1 
UHCUnified Hangul CodeКорейскийНетНет1–2WIN949, Windows949
UTF8Unicode, 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 
WIN1257Windows CP1257БалтийскийДаДа1 
WIN1258Windows CP1258ВьетнамскийДаДа1ABC, TCVN, TCVN5712, VSCII

Не все клиентские API поддерживают все перечисленные наборы символов. Например, драйвер JDBC для Tantor SE-1C не поддерживает наборы символов MULE_INTERNAL, LATIN6, LATIN8 и LATIN10.

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

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

initdb определяет кодировку по умолчанию для кластера Tantor SE-1C. Например,

initdb -E EUC_JP

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

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

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

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

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

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

Кодировка для базы данных хранится в системном каталоге pg_database. Вы можете увидеть ее, используя опцию -l команды psql или команду \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)

Важно

На большинстве современных операционных систем Tantor SE-1C может определить, какой набор символов подразумевается настройкой LC_CTYPE, и он будет обеспечивать использование только соответствующей кодировки базы данных. На старых системах необходимо самостоятельно убедиться, что вы используете кодировку, ожидаемую выбранной локалью. Ошибка в этой области может привести к странным поведением операций, зависящих от локали, таких как сортировка.

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

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

Tantor SE-1C поддерживает автоматическое преобразование наборов символов между сервером и клиентом для множества комбинаций наборов символов (Раздел 22.3.4 показывает, какие именно).

Чтобы включить автоматическое преобразование набора символов, необходимо сообщить Tantor SE-1C набор символов (кодировку), которую нужно использовать в клиенте. Существует несколько способов достичь этого:

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

    \encoding SJIS
    

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

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

    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.

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

Tantor SE-1C позволяет конвертировать между любыми двумя наборами символов, для которых в системном каталоге pg_conversion указана функция конвертации. Tantor SE-1C поставляется с некоторыми предопределенными конверсиями, которые кратко описаны в Таблица 22.4 и подробно показаны в Таблица 22.5. Вы можете создать новую конверсию с помощью SQL-команды CREATE CONVERSION. (Чтобы использовать конверсию для автоматической конвертации между клиентом и сервером, она должна быть помечена как default для пары наборов символов).

Таблица 22.4. Встроенные преобразования наборов символов клиента/сервера

Серверный набор символовДоступные наборы символов клиента
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 to 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

Таблица 22.5. Все встроенные преобразования наборов символов

Conversion Name [a] Source EncodingDestination Encoding
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

[a] Все имена преобразований следуют стандартной схеме именования: официальное имя исходной кодировки, в котором все неалфавитно-цифровые символы заменены на подчеркивания, за которым следует _to_, а затем аналогично обработанное имя кодировки назначения. Поэтому эти имена иногда отклоняются от привычных имен кодировок, указанных в Таблица 22.3.


22.3.5. Дополнительная информация #

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

Обработка информации CJKV: китайский, японский, корейский и вьетнамский компьютерный

Содержит подробные объяснения для EUC_JP, EUC_CN, EUC_KR, EUC_TW.

https://www.unicode.org/

Веб-сайт Unicode Consortium.

RFC 3629

UTF-8 (8-битный формат UCS/Unicode Transformation Format) определен здесь.