23.3. Suporte a conjunto de caracteres #

23.3.1. Conjuntos de caracteres com suporte
23.3.2. Definição do conjunto de caracteres
23.3.3. Conversão automática de conjuntos de caracteres entre servidor e cliente
23.3.4. Conversões de conjuntos de caracteres disponíveis
23.3.5. Leitura adicional

O suporte a conjunto de caracteres no PostgreSQL permite que se armazene texto em uma variedade de conjuntos de caracteres (também chamados de codificações), incluindo conjuntos de caracteres de um único byte, como a série ISO 8859, e conjuntos de caracteres de múltiplos bytes, como o EUC (Código Unix Estendido), o UTF-8 e o código interno MULE. Todos os conjuntos de caracteres com suporte podem ser usados ​​de forma transparente pelos clientes, mas alguns não são têm suporte para uso no servidor (isto é, como uma codificação do lado servidor). O conjunto de caracteres padrão é selecionado ao inicializar a instância do PostgreSQL usando o utilitário initdb. O conjunto de caracteres pode ser alterado quando se cria um banco de dados, para que se possa ter vários bancos de dados, cada um com um conjunto de caracteres diferente.

Entretanto, uma restrição importante é que o conjunto de caracteres de cada banco de dados deve ser compatível com as configurações de localidade LC_CTYPE (classificação dos caracteres) e LC_COLLATE (ordem de classificação de cadeia de caracteres) do banco de dados. Para as localidades C e POSIX qualquer conjunto de caracteres é permitido, mas para outras localidades fornecidas pela libc há apenas um conjunto de caracteres que funciona corretamente. (No Windows, entretanto, a codificação UTF-8 pode ser usada com qualquer localidade.) Se houver suporte ao ICU configurado, os locais fornecidos pelo ICU poderão ser usados ​​com a maioria, mas não com todas as codificações do lado servidor.

23.3.1. Conjuntos de caracteres com suporte #

A Tabela 23.3 mostra os conjuntos de caracteres disponíveis para uso no PostgreSQL.

Tabela 23.3. Conjuntos de caracteres no PostgreSQL

NomeDescriçãoIdiomaServidor?ICU?Bytes/​CharAliases
BIG5Big FiveChinês tradicionalNãoNão1–2WIN950, Windows950
EUC_CNCódigo-CN UNIX estendidoChinês simplificadoSimSim1–3 
EUC_JPCódigo-JP UNIX estendidoJaponêsSimSim1–3 
EUC_JIS_2004Código-JP UNIX estendido, JIS X 0213JaponêsSimNão1–3 
EUC_KRCódigo-KR UNIX estendidoCoreanoSimSim1–3 
EUC_TWCódigo-TW UNIX estendidoChinês tradicional, TaiwanêsSimSim1–4 
GB18030Padrão nacionalChinêsNãoNão1–4 
GBK>Padrão nacional estendidoChinês simplificadoNãoNão1–2WIN936, Windows936
ISO_8859_5ISO 8859-5, ECMA 113Latino/CirílicoSimSim1 
ISO_8859_6ISO 8859-6, ECMA 114Latino/ArábicoSimSim1 
ISO_8859_7ISO 8859-7, ECMA 118Latino/GregoSimSim1 
ISO_8859_8ISO 8859-8, ECMA 121Latino/HebraicoSimSim1 
JOHABJOHABCoreano (Hangul)NãoNão1–3 
KOI8RKOI8-RCirílico (Russo)SimSim1KOI8
KOI8UKOI8-UCirílico (Ucraniano)SimSim1 
LATIN1ISO 8859-1, ECMA 94Europa ocidentalSimSim1ISO88591
LATIN2ISO 8859-2, ECMA 94Europa centralSimSim1ISO88592
LATIN3ISO 8859-3, ECMA 94Sul da EuropaSimSim1ISO88593
LATIN4ISO 8859-4, ECMA 94Norte da EuropaSimSim1ISO88594
LATIN5ISO 8859-9, ECMA 128TurcoSimSim1ISO88599
LATIN6ISO 8859-10, ECMA 144NórdicoSimSim1ISO885910
LATIN7ISO 8859-13BálticoSimSim1ISO885913
LATIN8ISO 8859-14CélticoSimSim1ISO885914
LATIN9ISO 8859-15LATIN1 com Euro e acentosSimSim1ISO885915
LATIN10ISO 8859-16, ASRO SR 14111RomenoSimNão1ISO885916
MULE_INTERNALCódigo interno MULEEmacs multilíngueSimNão1–4 
SJISShift JISJaponêsNãoNão1–2Mskanji, ShiftJIS, WIN932, Windows932
SHIFT_JIS_2004Shift JIS, JIS X 0213JaponêsNãoNão1–2 
SQL_ASCIInão especificado (ver texto)todosSimNão1 
UHCCódigo Hangul unificadoCoreanoNãoNão1–2WIN949, Windows949
UTF8Unicode, 8-bittodosSimSim1–4Unicode
WIN866Windows CP866CirílicoSimSim1ALT
WIN874Windows CP874ThaiSimNão1 
WIN1250Windows CP1250Europa centralSimSim1 
WIN1251Windows CP1251CirílicoSimSim1WIN
WIN1252Windows CP1252Europa ocidentalSimSim1 
WIN1253Windows CP1253GregoSimSim1 
WIN1254Windows CP1254TurcoSimSim1 
WIN1255Windows CP1255HebraicoSimSim1 
WIN1256Windows CP1256ArábicoSimSim1 
WIN1257Windows CP1257BálticoSimSim1 
WIN1258Windows CP1258VietnamitaSimSim1ABC, TCVN, TCVN5712, VSCII

Nem todas as APIs cliente oferecem suporte a todos os conjuntos de caracteres listados. Por exemplo, o driver JDBC do PostgreSQL não oferece suporte a MULE_INTERNAL, LATIN6, LATIN8 e LATIN10.

A configuração SQL_ASCII se comporta de maneira consideravelmente diferente das outras configurações. Quando o conjunto de caracteres do servidor é SQL_ASCII, o servidor interpreta os valores de byte 0–127 segundo o padrão ASCII, enquanto os valores de byte 128–255 são considerados caracteres não interpretados. Nenhuma conversão de codificação será feita quando a configuração for SQL_ASCII. Portanto, esta configuração não é tanto uma declaração de que uma codificação específica está em uso, mas uma declaração de ignorância sobre a codificação. Geralmente, quando se está trabalhando com quaisquer dados não-ASCII não é aconselhável usar a configuração SQL_ASCII, porque o PostgreSQL não poderá ajudar convertendo ou validando dados contendo caracteres não-ASCII.

23.3.2. Definição do conjunto de caracteres #

O utilitário initdb define o conjunto de caracteres padrão (codificação) para uma instância do PostgreSQL. Por exemplo,

initdb -E EUC_JP

define o conjunto de caracteres padrão como EUC_JP (código Unix estendido para japonês). Pode-se usar --encoding ao invés de -E, se for preferido usar cadeias de caracteres de opções mais longas. Se nenhuma opção -E ou --encoding for fornecida, o initdb tentará determinar a codificação apropriada a ser usada com base na localidade especificada ou a padrão.

Pode-se especificar uma codificação não-padrão no momento da criação do banco de dados, desde que a codificação seja compatível com a localidade selecionada:

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

Este comando irá criar um banco de dados chamado korean, que usa o conjunto de caracteres EUC_KR, e a localidade ko_KR. Outra maneira de fazer isto é usando o seguinte comando SQL:

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

Note-se que os comandos acima especificam a cópia do banco de dados template0. Ao copiar qualquer outro banco de dados, as configurações de codificação e localidade não podem ser alteradas daquelas do banco de dados de origem, porque isto pode resultar em dados corrompidos. Para obter mais informações, veja Bancos de dados modelo.

A codificação para o banco de dados fica armazenada no catálogo do sistema pg_database. Pode ser vista usando a opção -l do psql, ou o meta-comando \l.

postgres=# \lx korean

Lista de bancos de dados
-[ RECORD 1 ]----------+------------
Nome                   | korean
Dono                   | hlinnaka
Codificação            | EUC_KR
Provedor de localidade | libc
Ordenação              | ko_KR.euckr
Ctype                  | ko_KR.euckr
Locale                 |
Regras ICU             |
Privilégios de acesso  |

Importante

Na maioria dos sistemas operacionais modernos, o PostgreSQL pode determinar qual conjunto de caracteres está implícito na configuração de LC_CTYPE, e irá forçar que apenas a codificação correspondente do banco de dados seja usada. Em sistemas mais antigos, é responsabilidade do usuário garantir o uso da codificação esperada pela localidade selecionada. Um erro nesta área levará provavelmente a um comportamento estranho em operações dependentes da localidade, como a classificação.

O PostgreSQL permitirá que superusuários criem bancos de dados com a codificação SQL_ASCII, mesmo quando LC_CTYPE não for C ou POSIX. Conforme visto acima, o SQL_ASCII não impõe que os dados armazenados no banco de dados tenham qualquer codificação específica, portanto esta escolha apresenta riscos de mau comportamento dependente de localidade. O uso dessa combinação de configurações está em obsolescência, podendo algum dia ser totalmente proibida.

23.3.3. Conversão automática de conjuntos de caracteres entre servidor e cliente #

O PostgreSQL fornece suporte à conversão automática de conjunto de caracteres entre servidor e cliente para muitas combinações de conjuntos de caracteres (Conversões de conjuntos de caracteres disponíveis mostra quais são elas).

Para ativar a conversão automática do conjunto de caracteres, deve-se informar ao PostgreSQL o conjunto de caracteres (codificação) que se gostaria que fosse usada no cliente. Existem várias maneiras disso ser feito:

  • Usando o meta-comando \encoding no psql. O meta-comando \encoding permite alterar a codificação do cliente a qualquer momento. Por exemplo, para alterar a codificação para SJIS é usado:

    \encoding SJIS
    

  • A libpq (Control Functions) tem funções para controlar a codificação do cliente.

  • Usando SET client_encoding TO. A configuração da codificação do cliente pode ser feita usando este comando SQL:

    SET CLIENT_ENCODING TO 'codificação';
    

    Além disso, pode ser usada a sintaxe do padrão SQL SET NAMES para esta finalidade:

    SET NAMES 'codificação';
    

    Para consultar a codificação corrente do cliente se usa:

    SHOW client_encoding;
    

    Para retornar à codificação padrão se usa:

    RESET client_encoding;
    

  • Usando PGCLIENTENCODING. Se a variável de ambiente PGCLIENTENCODING estiver definida no ambiente do cliente, esta codificação do cliente será selecionada automaticamente quando a conexão com o servidor for estabelecida. (Pode ser mudada depois usando qualquer um dos outros métodos mencionados acima.)

  • Usando a variável de configuração client_encoding. Se a variável client_encoding estiver definida, esta codificação do cliente será selecionada automaticamente quando a conexão com o servidor for estabelecida. (Pode ser mudada depois usando qualquer um dos outros métodos mencionados acima.)

Se a conversão de um determinado caractere não for possível — suponha que se escolheu EUC_JP para o servidor, e LATIN1 para o cliente, e são retornados alguns caracteres japoneses que não possuem representação em LATIN1 — então será relatado um erro.

Se o conjunto de caracteres do cliente estiver definido como SQL_ASCII, a conversão de codificação será desativada, independentemente do conjunto de caracteres do servidor. (Entretanto, se o conjunto de caracteres do servidor não for SQL_ASCII, o servidor ainda verificará se os dados recebidos são válidos para esta codificação; então o resultado final é como se o conjunto de caracteres do cliente fosse o mesmo do servidor.) Assim como para o servidor, o uso de SQL_ASCII é pouco sensato, a menos que se esteja trabalhando com todos os dados em ASCII.

23.3.4. Conversões de conjuntos de caracteres disponíveis #

O PostgreSQL permite a conversão entre quaisquer dois conjuntos de caracteres, para os quais uma função de conversão está listada no catálogo do sistema pg_conversion. O PostgreSQL vem com algumas conversões predefinidas, conforme resumido na Tabela 23.4, e mostrado com mais detalhes na Tabela 23.5. Pode-se criar uma nova conversão usando o comando SQL CREATE CONVERSION. (Para ser usada para conversões automáticas de cliente/servidor, a conversão deve ser marcada como padrão para seu par de conjuntos de caracteres.)

Tabela 23.4. Conversões de conjuntos de caracteres cliente/servidor integradas

Conjunto de caracteres do servidorConjuntos de caracteres do cliente disponíveis
BIG5sem suporte como codificação do servidor
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
GB18030sem suporte como codificação do servidor
GBKsem suporte como codificação do servidor
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
JOHABsem suporte como codificação do servidor
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
SJISsem suporte como codificação do servidor
SHIFT_JIS_2004sem suporte como codificação do servidor
SQL_ASCIIqualquer um (nenhuma conversão será realizada)
UHCsem suporte como codificação do servidor
UTF8todas as codificações com suporte
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

Tabela 23.5. Todas as conversões de conjuntos de caracteres integradas

Nome da conversão [a] Codificação da origemCodificação do destino
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] Os nomes de conversão seguem um esquema de nomenclatura padrão: O nome oficial da codificação de origem com todos os caracteres não alfanuméricos substituídos por sublinhados, seguidos por _to_, seguido pelo nome da codificação de destino processado de forma semelhante. Portanto, estes nomes às vezes se desviam dos nomes de codificação habituais mostrados na Tabela 23.3.


23.3.5. Leitura adicional #

Estas são boas fontes para começar a aprender sobre os vários tipos de sistemas de codificação.

CJKV Information Processing: Chinese, Japanese, Korean & Vietnamese Computing

Contém explicações detalhadas sobre EUC_JP, EUC_CN, EUC_KR, EUC_TW.

https://www.unicode.org/

O site do Consórcio Unicode.

RFC 3629

UTF-8 (formato de transformação UCS/Unicode de 8 bits) é definido aqui.