PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 23/11/2010 17:32:24

flo
Membre

Locale et tri

J'ai une base PostgreSQL 8.3, sous Linux (RHEL 5).
On me demande de faire un tri insensible à la casse. Mais le cluster a été créé avec une locale C.

 =# SHOW LC_COLLATE;
  lc_collate
 ------------
  C
 (1 ligne)


 =# SHOW LC_CTYPE;
  lc_ctype
 ----------
  C
 (1 ligne)

Donc si je trie une table de cette manière, les accents sont placés à la fin :

select col1, col2 from testtri order by upper(col2)
;

  col2
--------
 ARBR
 ARBRE
 arbre
 ARBRI
 Epi
 Zinzin
 È
 É
 Épi
 Ê
 è
 é
 épi
 ê
(14 lignes)

Hors les utilisateurs veulent un ordre de tri français (donc "é" avant "Zinzin").
D'après la doc (http://docs.postgresqlfr.org/8.3/charset.html) on ne peut pas modifier les ordres de tri une fois le cluster créé.
Y a-t-il tout de même une solution autre que recréér le cluster (c'est pour une application déjà en production)
?
Merci.

Dernière modification par flo (23/11/2010 17:34:13)

Hors ligne

#2 23/11/2010 17:37:13

Marc Cousin
Membre

Re : Locale et tri

Non, il n'y a pas. L'ordre de tri des chaînes est déterminé par le LC_COLLATE de la base. Si tu es coincée à C, il va falloir trier côté client je pense sad

C'est ce LC_COLLATE qui détermine le comportement de la fonction < entre deux chaînes.

Dernière modification par Marc Cousin (23/11/2010 17:37:56)


Marc.

Hors ligne

#3 23/11/2010 17:39:23

gleu
Administrateur

Re : Locale et tri

Remarque que, si tu étais en 8.4, tu pourrais. Je dis juste ça comme ça smile


Guillaume.

Hors ligne

#4 23/11/2010 17:42:03

Marc Cousin
Membre

Re : Locale et tri

Non, en 8.4, faudrait quand même créer une nouvelle base… et migrer les données dedans. À peine moins long que de créer un nouveau cluster.

Au passage, avoir le LOCALE à C, ça veut dire que les contraintes sur les varchar ne sont pas bonnes…


Marc.

Hors ligne

#5 23/11/2010 17:59:47

flo
Membre

Re : Locale et tri

J'ai dit ça au client (de passer en 8.4),  mais ça ne l'a pas fait rire wink
Moi ça ne me fait pas rire non plus au passage (ce n'est vraiment pas facile à faire en php, au point que j'ai trouvé le conseil de le faire faire... par la base de données...). Et même avec une solution, c'est sans compter la masse de travail (quasiment tous les tableaux à refaire).
On est obligés de rester en 8.3.

Bon, tant pis. Merci pour la confirmation (je me doutais de la réponse wink )

Hors ligne

#6 25/11/2010 10:38:00

jhashe
Membre

Re : Locale et tri

Bonjour,

Ayant été dans ce cas avant de tout migrer en PostgreSQL 9 (franchement, ça vaut le coup de réfléchir à une migration, et d'en profiter pour "basculer" en UTF8), j'avais adopté la stratégie suivante:

Création d'une fonction

CREATE OR REPLACE FUNCTION majuscule(character varying)
  RETURNS character varying AS
$BODY$SELECT UPPER(TRANSLATE($1,'ÉÈÊËéèêëàâùüçôîï','eeeeeeeeaauucoii')) AS RESULT$BODY$
  LANGUAGE sql IMMUTABLE;


Et la requête devient alors

select col1, col2 from testtri order by majuscule(col2);

Hors ligne

#7 25/11/2010 10:57:13

gleu
Administrateur

Re : Locale et tri

Ça permet le tri mais le gros problème, c'est côté performance. Impossible d'utiliser un index sur col2 pour trier rapidement dans ce cas.


Guillaume.

Hors ligne

#8 25/11/2010 12:14:42

jhashe
Membre

Re : Locale et tri

Je suis bien d'accord, c'est un pis-aller.
Mais, à l'époque où j'avais également des problèmes liés aux tris, ça m'a bien dépanné.

Et puis, je me trompe peut-être mais, dans des cas réels, souvent, on cherche à remonter un nombre d'enregistrement "raisonnable" et, dans ce cas, je suppose que le WHERE reste plus déterminant que le ORDER BY et peut dans ce cas continuer à exploiter les index.

Hors ligne

#9 25/11/2010 12:38:38

gleu
Administrateur

Re : Locale et tri

Yep, c'est un pis-aller mais au moins ça fonctionne smile


Guillaume.

Hors ligne

#10 25/11/2010 12:42:34

flo
Membre

Re : Locale et tri

Nous avons choisi ce style de solution également, au final (sauf qu'on n'a pas le droit non plus de faire du PL, donc on modifie toutes les requêtes pour ajouter le translate.

Hors ligne

Pied de page des forums