20.2. Support des jeux de caractères

Le support des jeux de caractères dans PostgreSQL vous permet de rentrer du texte dans plusieurs jeux de caractères, dont des jeux de caractères à un octet tels que la série ISO 8859 et des jeux de caractères multi-octets tel que EUC (Extended Unix Code), Unicode et le code interne de Mule. Tous les jeux de caractères peuvent être utilisés de façon transparente au travers du serveur. (Si vous utilisez des fonctions d'extension d'autres sources, cela dépend de la qualité du code.) Le jeu de caractères par défaut est sélectionné pendant l'initialisation de votre cluster de base de données PostgreSQL avec initdb. Le choix peut être outrepassé lorsqu'on crée une base de données en utilisant createdb ou en utilisant la commande SQL CREATE DATABASE. Vous pouvez donc avoir de multiples bases chacune avec un jeux de caractères différents.

20.2.1. Jeux de caractères supportés

Le Tableau 20-1 montre les jeux de caractères disponibles à l'utilisation sur le serveur.

Tableau 20-1. Jeux de Caractères Serveur

NomDescription
SQL_ASCIIASCII
EUC_JPJaponais EUC
EUC_CNChinois EUC
EUC_KRCoréen EUC
JOHABCoréen EUC (base Hangle)
EUC_TWTaiwanais EUC
UNICODEUnicode (UTF-8)
MULE_INTERNALCode interne de Mule
LATIN1ISO 8859-1/ECMA 94 (Alphabet latin no.1)
LATIN2ISO 8859-2/ECMA 94 (Alphabet latin no.2)
LATIN3ISO 8859-3/ECMA 94 (Alphabet latin no.3)
LATIN4ISO 8859-4/ECMA 94 (Alphabet latin no.4)
LATIN5ISO 8859-9/ECMA 128 (Alphabet latin no.5)
LATIN6ISO 8859-10/ECMA 144 (Alphabet latin no.6)
LATIN7ISO 8859-13 (Alphabet latin no.7)
LATIN8ISO 8859-14 (Alphabet latin no.8)
LATIN9ISO 8859-15 (Alphabet latin no.9)
LATIN10ISO 8859-16/ASRO SR 14111 (Alphabet latin no.10)
ISO_8859_5ISO 8859-5/ECMA 113 (Latin/Cyrillique)
ISO_8859_6ISO 8859-6/ECMA 114 (Latin/Arabe)
ISO_8859_7ISO 8859-7/ECMA 118 (Latin/Grec)
ISO_8859_8ISO 8859-8/ECMA 121 (Latin/Hébreu)
KOI8KOI8-R(U)
ALTWindows CP866
WIN874Windows CP874 (Thai)
WIN1250Windows CP1250
WINWindows CP1251
WIN1256Windows CP1256 (Arabe)
TCVNTCVN-5712/Windows CP1258 (Vietnamien)

Important : Avant PostgreSQL 7.2, LATIN5 signifiait, à tort, ISO 8859-5. A partir de 7.2, LATIN5 signifie ISO 8859-9. Si vous avez une base LATIN5 créée sur une version 7.1 ou antérieure et vous voulez migrer vers 7.2 ou une version plus récente, vous devriez faire attention à ce changement.

Tout les APIs ne supportent pas les jeux de caractères de la liste. Par exemple, le pilot JDBC de PostgreSQL ne supporte pas MULE_INTERNAL, LATIN6, LATIN8 et LATIN10.

20.2.2. Choisir le Jeu de Caractères

initdb définit le jeu de caractères par défaut pour un cluster PostgreSQL. Par exemple,

initdb -E EUC_JP

paramètre le jeu de caractères (codage) à EUC_JP (Extended Unix Code for Japanese). Vous pouvez utiliser l'option --encoding au lieu de -E si vous préférez saisir les noms d'options longs. Si aucune option -E ou --encoding n'est donnée, SQL_ASCII est utilisé.

Vous pouvez créer une base de données avec un jeu de caractère différent:

createdb -E EUC_KR korean

Ceci va créer une base de données appelée korean qui utilisera le jeu de caractère EUC_KR. Un autre moyen de réaliser ceci est d'utiliser cette commande SQL :

CREATE DATABASE korean WITH ENCODING 'EUC_KR';

L'encodage pour une base de données est conservé dans le catalogue système pg_database. Vous pouvez voir ceci en utilisant l'option -l ou la commande \l de psql.

$ psql -l
            List of databases
   Database    |  Owner  |   Encoding    
---------------+---------+---------------
 euc_cn        | t-ishii | EUC_CN
 euc_jp        | t-ishii | EUC_JP
 euc_kr        | t-ishii | EUC_KR
 euc_tw        | t-ishii | EUC_TW
 mule_internal | t-ishii | MULE_INTERNAL
 regression    | t-ishii | SQL_ASCII
 template1     | t-ishii | EUC_JP
 test          | t-ishii | EUC_JP
 unicode       | t-ishii | UNICODE
(9 rows)

Important : Bien que vous pouvez spécifier tout codage que vous souhaitez pour une base de données, il est déconseillé de choisir un codage qui n'est pas attendu par la locale sélectionnée. Les paramètres LC_COLLATE et LC_CTYPE impliquent un codage particulier, et les opérations dépendantes de la locale (comme le tri) pourraient mal interpréter les données qui sont dans un codage incompatible.

Comme ces paramètres de locale sont gelés par initdb, la flexibilité apparente pour utiliser différents codages dans les différentes bases de données d'un groupe est plus théorique que réel. Il est probable que ces mécanismes soient revus dans les prochaines versions de PostgreSQL.

Une façon d'utiliser les codages multiples en toute sûreté est de configurer la locale à C ou POSIX lors d'initdb, désactivant toute connaissance réelle de la locale.

20.2.3. Conversion de Jeu de Caractères Automatique entre Serveur et Client

PostgreSQL supporte les conversions automatiques de jeu de caractères entre client et serveur pour certains jeux de caractères. Les informations de conversion sont conservés dans le catalogue système pg_conversion. Vous pouvez créer une nouvelle conversion en utilisant la commande SQL CREATE CONVERSION. PostgreSQL est livré avec certaines conversions prédéfinies. Ils sont listés dans Tableau 20-2.

Tableau 20-2. Conversion de Jeux de Caractères Client/Serveur

Jeu de Caractères ServeurJeux de Caractères Clients Disponibles
SQL_ASCIISQL_ASCII, UNICODE, MULE_INTERNAL
EUC_JPEUC_JP, SJIS, UNICODE, MULE_INTERNAL
EUC_CNEUC_CN, UNICODE, MULE_INTERNAL
EUC_KREUC_KR, UNICODE, MULE_INTERNAL
JOHABJOHAB, UNICODE
EUC_TWEUC_TW, BIG5, UNICODE, MULE_INTERNAL
LATIN1LATIN1, UNICODE MULE_INTERNAL
LATIN2LATIN2, WIN1250, UNICODE, MULE_INTERNAL
LATIN3LATIN3, UNICODE, MULE_INTERNAL
LATIN4LATIN4, UNICODE, MULE_INTERNAL
LATIN5LATIN5, UNICODE
LATIN6LATIN6, UNICODE, MULE_INTERNAL
LATIN7LATIN7, UNICODE, MULE_INTERNAL
LATIN8LATIN8, UNICODE, MULE_INTERNAL
LATIN9LATIN9, UNICODE, MULE_INTERNAL
LATIN10LATIN10, UNICODE, MULE_INTERNAL
ISO_8859_5ISO_8859_5, UNICODE, MULE_INTERNAL, WIN, ALT, KOI8
ISO_8859_6ISO_8859_6, UNICODE
ISO_8859_7ISO_8859_7, UNICODE
ISO_8859_8ISO_8859_8, UNICODE
UNICODE EUC_JP, SJIS, EUC_KR, UHC, JOHAB, EUC_CN, GBK, EUC_TW, BIG5, LATIN1 to LATIN10, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, WIN, ALT, KOI8, WIN1256, TCVN, WIN874, GB18030, WIN1250
MULE_INTERNALEUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN5, WIN, ALT, WIN1250, BIG5, ISO_8859_5, KOI8
KOI8ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
ALTISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
WIN874WIN874, UNICODE
WIN1250LATIN2, WIN1250, UNICODE, MULE_INTERNAL
WINISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
WIN1256WIN1256, UNICODE
TCVNTCVN, UNICODE

Pour activer la conversion automatique de jeux de caractères, vous devez dire à PostgreSQL quel jeu de caractères (encodage) vous voulez utiliser côté client. Il y'a plusieurs façons de faire cela:

Si la conversion d'un caractère particulier n'est pas possible — supposons que vous avez choisi EUC_JP pour le serveur et LATIN1 pour le client, alors certains caractères japonais ne pourront pas être convertis en LATIN1 — ils seront transformés en leur valeur hexadécimale entre parenthèses, i.e., (826C).

20.2.4. Plus de Lecture

Voici de bonnes sources pour commencer à maîtriser les différents jeux de caractères.

ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf

Des explications détaillées de EUC_JP, EUC_CN, EUC_KR, EUC_TW apparaissent dans la section 3.2.

http://www.unicode.org/

Le site web du Unicode Consortium

RFC 2044

UTF-8 est défini ici.