Le support des locales fait référence à une application respectant les préférences culturelles au regard des alphabets, du tri, du format des nombres, etc. PostgreSQL utilise les possibilités offertes par C et POSIX du standard ISO fournies par le système d'exploitation du serveur. Pour plus d'informations, consulter la documentation du système.
Le support des locales est configuré automatiquement lorsqu'un cluster de
base de données est créé avec initdb
.
initdb
initialise le cluster avec la valeur des
locales de son environnement d'exécution par défaut. Si le système est
déjà paramétré pour utiliser la locale souhaitée pour le cluster, il n'y
a donc rien d'autre à faire. Si une locale différente est souhaitée (ou
que celle utilisée par le serveur n'est pas connue avec certitude), il
est possible d'indiquer à initdb
la locale à
utiliser à l'aide de l'option --locale
.
Par exemple :
initdb --locale=sv_SE
Cet exemple pour les systèmes Unix positionne la locale au suédois
(sv
) tel que parlé en
Suède (SE
). Parmi les autres possibilités, on peut
inclure en_US
(l'anglais américain) ou
fr_CA
(français canadien). Si plus d'un ensemble de
caractères peuvent être utilisés pour une locale, alors les spécifications
peuvent prendre la forme langage_territoire.codeset
.
Par exemple, fr_BE.UTF-8
représente la langue française
telle qu'elle est parlée en Belgique (BE), avec un encodage
UTF-8.
Les locales
disponibles et leurs noms dépendent de l'éditeur du système d'exploitation
et de ce qui est installé. Sur la plupart des systèmes Unix, la commande
locale -a
fournit la liste des locales disponibles.
Windows utilise des noms de locale plus verbeux, comme
German_Germany
ou Swedish_Sweden.1252
mais le principe est le même.
Il est parfois utile de mélanger les règles de plusieurs locales, par exemple d'utiliser les règles de tri anglais avec des messages en espagnol. Pour cela, des sous-catégories de locales existent qui ne contrôlent que certains aspects des règles de localisation :
LC_COLLATE | Ordre de tri des chaînes de caractères |
LC_CTYPE | Classification de caractères (Qu'est-ce qu'une lettre ? La majuscule équivalente ?) |
LC_MESSAGES | Langue des messages |
LC_MONETARY | Formatage des valeurs monétaires |
LC_NUMERIC | Formatage des nombres |
LC_TIME | Formatage des dates et heures |
Les noms des catégories se traduisent par des options à la commande
initdb
qui portent un nom identique pour surcharger
le choix de locale pour une catégorie donnée. Par exemple, pour utiliser
la locale français canadien avec des règles américaines pour le
formatage monétaire, on utilise
initdb --locale=fr_CA --lc-monetary=en_US
.
Pour bénéficier d'un système qui se comporte comme s'il ne disposait pas du
support des locales, on utilise les locales spéciales C
ou un équivalent, POSIX
.
Certaines catégories de locales doivent avoir leur valeurs fixées lors de la
création de la base de données. Vous pouvez utiliser des paramétrages
différents pour chaque bases de données. En revanche, une fois que la base
est créée, les paramétrages de locales ne peuvent plus être modifiés.
LC_COLLATE
et LC_CTYPE
sont
ces catégories. Elles affectent l'ordre de tri des index et doivent donc
rester inchangées, les index sur les colonnes de texte risquant d'être
corrompus dans le cas contraire.
(Mais vous pouvez lever ces restrictions sur les collations, comme cela est
discuté dans Section 23.2.)
La valeur par défaut pour ces catégories
est déterminée lors de l'exécution d'initdb
. Ces valeurs
sont utilisées quand de nouvelles bases de données sont créées, sauf si
d'autres valeurs sont indiquées avec la commande CREATE
DATABASE
.
Les autres catégories de locale peuvent être modifiées à n'importe quel
moment en configurant les variables d'environnement de même nom (voir la
Section 19.11.3 pour de plus amples
détails). Les valeurs par défaut choisies par
initdb
sont en fait écrites dans le fichier de
configuration postgresql.conf
pour servir de
valeurs par défaut au démarrage du serveur. Si ces déclarations sont
supprimées du fichier postgresql.conf
, le serveur
hérite des paramètres de son environnement d'exécution.
Le comportement des locales du serveur est déterminé par les variables d'environnement vues par le serveur, pas par celles de l'environnement d'un quelconque client. Il est donc important de configurer les bons paramètres de locales avant le démarrage du serveur. Cela a pour conséquence que, si les locales du client et du serveur diffèrent, les messages peuvent apparaître dans des langues différentes en fonction de leur provenance.
Hériter la locale de l'environnement d'exécution signifie, sur la
plupart des systèmes d'exploitation, la chose suivante :
pour une catégorie de locales donnée (l'ordonnancement par exemple)
les variables d'environnement LC_ALL
,
LC_COLLATE
(ou la variable qui correspond à la catégorie)
et LANG
sont consultées dans cet ordre jusqu'à en
trouver une qui est fixée. Si aucune de ces variables n'est fixée,
c'est la locale par défaut, C
, qui est utilisée.
Certaines bibliothèques de localisation regardent aussi la variable
d'environnement LANGUAGE
qui surcharge tout autre
paramètre pour fixer la langue des messages. En cas de doute,
lire la documentation du système d'exploitation,
en particulier la partie concernant gettext.
Pour permettre la traduction des messages dans la langue préférée de
l'utilisateur, NLS doit avoir été activé pendant la
compilation (configure --enable-nls
). Tout autre support
de la locale est construit automatiquement.
Le paramétrage de la locale influence les fonctionnalités SQL suivantes :
l'ordre de tri dans les requêtes utilisant ORDER BY
ou les opérateurs de comparaison standards sur des données de type
texte ;
Les opérateurs de correspondance de motifs (LIKE
, SIMILAR TO
et les expressions rationnelles de type POSIX); les locales affectent aussi bien
les opérateurs insensibles à la classe et le classement des caractères par les expressions
rationnelles portant sur des caractères.
La possibilité d'utiliser des index avec des clauses LIKE
Le support des locales autres que C
ou
POSIX
dans PostgreSQL a
pour inconvénient son impact sur les performances. Il ralentit la gestion
des caractères et empêche l'utilisation des index ordinaires par
LIKE
. Pour cette raison, il est préférable de
n'utiliser les locales qu'en cas de réel besoin.
Toutefois, pour permettre à PostgreSQL d'utiliser
des index avec les clauses LIKE
et une locale
différente de C
, il existe plusieurs classes
d'opérateurs personnalisées. Elles permettent
la création d'un index qui réalise une stricte comparaison caractère par
caractère, ignorant les règles de comparaison des locales. Se référer à
la Section 11.9 pour plus d'informations. Une autre
possibilité est de créer des index en utilisant la collation
C
, comme cela est indiqué dans
Section 23.2.
Si le support des locales ne fonctionne pas au regard des explications ci-dessus,
il faut vérifier que le support des locales du système d'exploitation est
correctement configuré. Pour vérifier les locales installées sur
le système, on peut utiliser la commande locale -a
,
si elle est fournie avec le système d'exploitation.
Il faut vérifier que PostgreSQL utilise
effectivement la locale supposée. Les paramètres LC_COLLATE
et LC_CTYPE
sont déterminés lors de la création de la base
de données et ne peuvent pas être modifiés sauf en créant une nouvelle
base de données.
D'autres paramètres de locale, y compris LC_MESSAGES
et
LC_MONETARY
, sont déterminés initialement par
l'environnement dans lequel le serveur est lancé mais peuvent être
modifiés pendant l'exécution. Pour vérifier le paramétrage
de la locale active on utilise la commande SHOW
.
Le répertoire src/test/locale
de la distribution
source contient une série de tests pour le support des locales dans
PostgreSQL.
Les applications clientes qui gèrent les erreurs en provenance du serveur par l'analyse du texte du message d'erreur vont certainement éprouver des difficultés lorsque les messages du serveur sont dans une langue différente. Les auteurs de telles applications sont invités à utiliser le schéma de code d'erreur à la place.
Le maintien de catalogues de traductions de messages nécessitent les efforts permanents de beaucoup de volontaires qui souhaitent voir PostgreSQL parler correctement leur langue préférée. Si certains messages dans une langue ne sont pas disponibles ou pas complètement traduits, toute aide est la bienvenue. Pour apporter son aide à ce projet, consulter le Chapitre 54 ou écrire à la liste de diffusion des développeurs.