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 :

Recherche d'une chaine dans un champ


Sujet :

PostgreSQL

  1. #1
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut Recherche d'une chaine dans un champ
    Bonjour à tous et bonne année !

    Ma base est en UNICODE sur PgSQL 8.1 sur un serveur Gentoo.

    Je souhaite faire une recherche du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL > SELECT titre FROM table WHERE titre LIKE '%toto%';
    Jusque là c'est bon. Maintenant je souhaite que ma recherche ne soit pas sensible à la casse et surtout prenne en compte les accents !
    La donnée que je veux rechercher provient d'un formulaire traité en PHP en UTF-8.

    J'ai donc tenter le code suivant (en gros) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PHP > $Recherche = strtolower($Recherche);
    SQL > SELECT titre FROM table WHERE LOWER(titre) LIKE '%$Recherche%';
    Mais cela ne fonctionne pas dès qu'il y a un accent. La fonction LOWER converti étrangement....

    Voyant qu'ils ne convertissent pas de la même manière j'ai tenter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PHP > $Recherche = SELECT LOWER($Recherche);
    SQL > SELECT titre FROM table WHERE LOWER(titre) LIKE '%$Recherche%';
    Mais toujours pas ... :'(

    J'ai testé avec l'opérateur ~* mais sans succès (peut être une mauvaise utilisation de ma part).

    J'ai trouvé quelques méthodes sur le forum comme notament le fait d'avoir un autre champ sans les accents et faire la recherche dessus. Mais cette solution c'est pas envisageable dans mon cas car je fais des recherches sur beaucoup de tables et champs et surtout je ne traite pas que du français, l'anglais, l'allemand et le japonais sont de la partie (d'autres risquent de s'inviter aussi).

    Je commence à me poser des questions car si je n'arrive pas à traiter du français, ça risque d'être très compliqué pour les autres langues !!!!!


    C'est pour cela que je fais appel à vos compétences

  2. #2
    Membre averti
    Homme Profil pro
    Coordinateur développement web
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Coordinateur développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 412
    Points
    412
    Par défaut
    Salut,

    Pour que ton like ne prenne pas en compte la case, utilise ilike

    pour le reste je ne sait pas

    Mic

  3. #3
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 858
    Points : 3 460
    Points
    3 460
    Par défaut
    Bonjour,

    Je pense que le langage SQL de base n'est pas adapté à la recherche dans des champs texte. Le fait d'utiliser un like avec des % est une manière de rechercher, mais comme tu l'as constaté c'est assez limité..

    Pour bien faire, il faut utiliser une modelisation différente qui réponde à tes besoins en terme de recherche. Je te conseille de poster ce message dans le forum "langage SQL", car des personnes du forum ( je pense notamment à Mr Brouard ) pourront te donner des pistes plus sensées par rapport à la problématique de la recherche. Le multilangue est un problème qui vient s'ajouter à la liste.....

    Sache qu'il existe des moteurs de recherche tout fait ( Verity par exemple ) qui fonctionnent très bien et permettent d'indexer des documents également, ce sont les outils utilisés en général pour de les recherches compliquées..

    Bon courage

  4. #4
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    J'ai testé aussi le ILIKE qui fonctionne pour la casse mais pas du tout pour les accents (même comportement que LIKE et c'est normal). De plus ILIKE n'est pas du tout standard il me semble. Donc à éviter...

    Je connais (sans l'avoir utilisé) Verity mais le problème est qu'il est loin d'être gratuit et surtout il est très complexe pour ce que j'ai besoin de faire.

    Ce que je trouve étrange c'est que c'est vraiment une recherche toute simple. Et je ne souhaite pas déployer une usine pour faire ça !
    Dans le pire des cas je souhaite avoir une réponse pour la requête suivante lorsque j'ai "titre" qui vaut "élément" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT titre FROM table WHERE titre LIKE '%elem%';
    Le luxe serait de gérer aussi les majuscules avec accents tel que "Élément" car mes client sont équipés de Mac et il est très facile de faire ces caractères au clavier contrairement au PC.

  5. #5
    Membre averti

    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 338
    Points : 404
    Points
    404
    Par défaut
    Bonjour

    Si ta base est en unicode et que lors d'une recherche avec des accents tu as des erreurs, c'est que l'encodage de ton client n'est pas unicode.

    Il va falloir utiliser la variable CLIENT_ENCODING comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET CLIENT_ENCODING TO 'LATIN9';
    Faire un phpinfo() pour avoir l'encodage utiliser par PHP

    Pour l'histoire de mot écrit avec ou sans accent, regarde du coté de to_ascii() (y'a des exemples sur ce forum.

  6. #6
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    Ou on trouve ça sur le phpinfo ?

    Car mes fichiers de code et mes headers sont en UTF-8. De plus toutes les autres requêtes fonctionnent. Donc pourquoi que celle-là ?

    Edit : la fonction TO_ASCII ne fonctionne pas en UNICODE :'(
    La conversion du codage de UNICODE vers l'ASCII n'est pas supportée

Discussions similaires

  1. recherche d'une chaine dans un champ
    Par ferhat.adel dans le forum Débuter
    Réponses: 3
    Dernier message: 14/06/2011, 11h53
  2. [VB.NET] Recherche d'une chaine dans une autre
    Par Remedy dans le forum Windows Forms
    Réponses: 6
    Dernier message: 19/07/2006, 17h10
  3. Rechercher remplacer une chaine dans 150 procs.
    Par gregco1 dans le forum Oracle
    Réponses: 8
    Dernier message: 14/06/2006, 17h39
  4. Recherche d'une chaine dans une autre chaine
    Par arnapou dans le forum C
    Réponses: 7
    Dernier message: 31/01/2006, 23h10
  5. [Tableaux] Recherche d'une chaine dans un tableau
    Par tom06440 dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2005, 23h27

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