PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Locale pour une base de données multilingue

Technique - installation | Locale pour une base de données multilingue

Par genepi le 27/08/2006 - 20:37

Bonjour,

Je dois créer une base de données multilingue mais j'ai quelques problèmes pour comprendre le fonctionnement PostgreSQL par rapports aux autres SGBD.

Dans ma base de données, je dois conserver des textes dans différentes langues, ce qui fait que je conserverai les données en UNICODE (UTF-8). À chaque texte conservé, j'ai une colonne qui indique la langue du contenu.
Exemple:

CREATE TABLE documents (
id INTEGER,
texte TEXT,
locale TEXT
)

PostgreSQL est installé sur un serveur Debian qui utilise pour locale fr_CA.ISO-8859-1.

Mon problème est de comprendre quels sont les paramètres à utiliser pour l'installation du serveur et de la création de la base de données.

1) À quoi sert le paramétrage de la locale au moment d'installer le serveur? D'après ce que je comprends de la documentation, ça a un impact sur l'ordre de tri des indexes pour les bases de données du cluster.
J'ai essayé d'installer mon serveur en choisissant fr_CA.UTF-8 mais j'avais des problèmes d'affichage dans psql. Je pense qu'il suffisait de définir l'encodage du client, mais je n'ai pas insisté et j'ai reconfiguré en ISO-8859-1, puis créé la base de données en UNICODE.

2) Comme toutes les langues sont contenues dans une même colonne, mais que les recherches s'effectuent dans une seule langue (spécifiée par l'autre colonne), j'aurais imaginé pouvoir spécifier la collation de l'ordre de tri dynamiquement au moment de l'exécution de la requête. Du genre (c'est moi qui invente cette syntaxe du COLLATE):

SELECT texte
FROM documents
WHERE locale = 'fr'
ORDER BY texte COLLATE 'fr'

D'après ce que je comprend de la documentation (http://docs.postgresqlfr.org/7.4/sql-select.html), l'ordre de tri est donné par la locale de l'initdb, donc ça veut dire qu'il est le même pour toutes les langues utilisées dans la base de données. Est-ce correct et quel est l'impact/intérêt/performance de ce paramétrage initial?

3) Quels conseils ou paramétrage de mon serveur/BD me donneriez-vous pour résoudre au mieux ce problème avec PostgreSQL? Je voudrai partir du bon pied et éviter d'avoir à remonter mon serveur lorsqu'il sera en production...

L'application qui accédera à ces données est programmée en Java, donc au pire je pourrai récupérer toutes les données non triées et effectuer le tri dynamiquement en fonction de la collation de la langue. Mais je préférais si ces détails étaient résolus simplement au niveau des données.

Merci

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

UTF-8 collation for PostgreSQL

genepi/ = 28 Août, 2006 - 00:25

Je me répond à moi-même, après avoir cherché une bonne partie de l'après-midi sur le sujet. Ce qui semble le plus correspondre à mon besoin serait pg_collkey [http://www.flexiguided.de/publications.pgcollkey.en.html].

Tiré du README:
"pg_collkey is a wrapper to use the collation functions of the ICU library with a PostgreSQL database server. Using this wrapper, you can specify the desired locale for sorting UTF-8 strings directly in the SQL query, rather than setting it during database installation. Default Unicode collation (DUCET) is supported. You can select whether punctuation should be a primary collation attribute or not. The level of comparison can be limited (in order to ignore accents for example). Numeric sequences of strings can be recognized, so that 'test2' is placed before 'test10'."

Ça me permettra d'écrire ma requête de la façon suivante:
SELECT texte
FROM documents
WHERE locale = 'fr'
ORDER BY collkey(texte, locale);

Il me reste 2 petits soucis:
1 - Backporter pg_collkey pour ma version de PostgreSQL.
2 - Comme je suppose que cette extension a un impact non négligeable sur la performance de tris (mais c'est un point essentiel de mon application), il me faut déterminer un paramétrage optimal de mon serveur/BD pour les autres requêtes qui ne dépendent pas d'un tri linguistique.
Que me conseillez-vous? "C" ou autre chose...


© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.