IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Mauvaise collation à l'initdb


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut Mauvaise collation à l'initdb
    Bonjour,

    je viens de me rendre compte que j'avais mal paramétré mes collation pour les recherches lors de l'initdb.
    J'ai cherché un moyen de les modifiés mais d'après ce que je vois dans toutes les docs, c'est impossible.
    Cela m'obligerais à refaire les initdb, ce qui ne m'arrange pas sur des bases en production.
    Y a t'il un moyen de modifier ceci ou dois-je repartir de presque zéro ??

    Merci pour vos réponses.

  2. #2
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Qu'appelles-tu une 'collation' ?
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Merci pour ta réponse.

    par collation j'entends la façon dont postgres doit gérer les égalité de lettres.
    Je connais 2 types de tests :
    • la casse : a=A
    • les accents : é=e
    cela permet de faire un select * where prenom="herve" et de voir comme réponse "Hervé" par exemple.

    Ceci est lié au paramétrage de la variable lc_collate. J'ai relancé mon initdb avec ce que je pensais être bon mais ce n'est pas le cas.
    Voici ce que j'ai en ce moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select name, setting from pg_settings where name ~* 'lc';
        name     |     setting
    -------------+-----------------
     lc_collate  | fr_FR.utf8
     lc_ctype    | fr_FR.utf8@euro
     lc_messages | fr_FR.utf8
     lc_monetary | fr_FR.utf8@euro
     lc_numeric  | fr_FR.utf8@euro
     lc_time     | fr_FR.utf8@euro
    D'après ce que je vois dans les docs et sur les forums, ceci est très lié au local du shell.

    j'avoue y perdre un peu mon latin.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par htristra Voir le message
    Merci pour ta réponse.

    par collation j'entends la façon dont postgres doit gérer les égalité de lettres.
    Je connais 2 types de tests :
    • la casse : a=A
    • les accents : é=e
    cela permet de faire un select * where prenom="herve" et de voir comme réponse "Hervé" par exemple.

    Ceci est lié au paramétrage de la variable lc_collate. J'ai relancé mon initdb avec ce que je pensais être bon mais ce n'est pas le cas.
    Voici ce que j'ai en ce moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select name, setting from pg_settings where name ~* 'lc';
        name     |     setting
    -------------+-----------------
     lc_collate  | fr_FR.utf8
     lc_ctype    | fr_FR.utf8@euro
     lc_messages | fr_FR.utf8
     lc_monetary | fr_FR.utf8@euro
     lc_numeric  | fr_FR.utf8@euro
     lc_time     | fr_FR.utf8@euro
    D'après ce que je vois dans les docs et sur les forums, ceci est très lié au local du shell.

    j'avoue y perdre un peu mon latin.
    êtes-vous certain de vouloir résoudre cette situation avec un paramètre qui influencera TOUT le cluster ? (càd toutes les DB gérées par ce serveur… toutes les tables, tous les champs texte…)

    une solution moins lourde de conséquences serait d'avoir une fonction qui convertit la chaîne à rechercher en pattern où toutes les voyelles sont remplacées par leurs variantes accentuées possibles, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select make_accented_pattern('herve')
    renverrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    h[éeéÉèÈêÊëË]rv[eéÉèÈêÊëË]
    et il serait ainsi possible d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * fromwhere prenom ~* make_accented_pattern('herve') ;
    mais il faudra probablement écrire make_accented_pattern en C…

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Merci pour cette réponse JeitEmgie, j'avoue ne pas avoir penser à ça.

    Je vais utilisé une variante de votre solution. Je vais plutôt la forme majuscule sans accent (Hervé -> HERVE) et produire un index dessus (presque un million de ligne dans la table).

    J'ai également vu que l'on pouvait indexé le résultat d'une fonction :

    CREATE INDEX toto ON tablenom EnMajsu(nom);

    En forçant le select à utilisé cet index, je devrais plutôt bien m'en sortir.

    Merci pour vos réponses.

  6. #6
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 251
    Points : 192
    Points
    192
    Par défaut
    Bonjour JeitEmgie


    En fait je voudrais faire exactement ce qu'à décrit htristra et tu semble avoir une solution pour le faire ?

    Cela ne me dérange pas d'avoite ce comportement sur toute ma base de données bien au contraire...

    Pour rappel j'ai besin des comportements suivants :

    pas de différence entre majuscules et miniscules : exp: a=A
    caractères accentués équaivalent aux non-accentués : exp: é=e


    Merci de bien vouloir m'indiquer comment faire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb initdb postgresql 7.4 + cygwin
    Par lozy dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 04/03/2004, 10h37
  2. Problème avec COLLATE FR_FR
    Par nico27 dans le forum SQL
    Réponses: 4
    Dernier message: 27/02/2004, 13h20
  3. aide PL/SQL syntaxes [debutant] [mauvaise doc]
    Par sdeb dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 19/01/2004, 12h59
  4. Réponses: 3
    Dernier message: 04/09/2002, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo