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

SQL Procédural MySQL Discussion :

Comment effectuer une comparaison LIKE insensible à la casse ?


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut Comment effectuer une comparaison LIKE insensible à la casse ?
    Bonjour,
    j'ai une requête avec un like que je voudrais rendre insensible à la casse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT id_document, identifiant_meta 
    FROM vue_moteur_recherche 
    WHERE (identifiant_meta = 'format' AND valeur_meta like '%word%') )
    Vous aurez compris que je voudrais que ma requête me retourne les enregistrements dont le champ valeur_meta contient Word ou word indiférament.
    Or, il semble que chez moi, like soit sensible à la casse (ce qui est bizzare, car au cours de mes recherches j'ai lu plusieures fois qu'il était censé être insensible).
    J'ai essayé de jouer avec les fonction UPPER() ou LOWER() de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT id_document, identifiant_meta 
    FROM vue_moteur_recherche 
    WHERE (identifiant_meta = 'format' AND UPPER(valeur_meta) like UPPER('%word%')) )
    => même résultat, la requête est sensible à la casse ... c'est incompréhensible on dirait que les fonctions upper et lower n'ont strictement aucun effet (est-ce à cause du like ou des jokers ?)
    J'en viens à me demander si ce n'est pas un problème de config de mon serveur (mais lequel ?).

    Y'a t'il une astuce miracle en SQL ?
    Dois-je faire un réglage sur mysql ?

    Je précise que je travaille sur MySQL 5 sous windows, les champs interrogés par ma requete sont issus d'une vue, ils sont dans leur table d'origine de type varchar et d'interclassement latin1_swedish_ci

    Merci d'avance aux pros de MySQL du forum

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Bonjour,

    Tu pourrais utiliser BINARY. Cf http://www.developpez.net/forums/sho...ighlight=casse

    D'autres posts en parlent, fais une recherche sur "casse" dans le forum.
    Pensez au bouton

  3. #3
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    OK, merci de ta réponse.
    Je sais pas si j'ai bien compris, mais il me semble que BINARY est censé rendre sensible une comparaison qui à la base ne l'est pas (c'est bien ça ?)
    Or, moi c'est exactement le contraire que je veux faire : sensible >>> insensible.

    Pour ce qui est de la recherche sur le forum, je l'avais déja faite avant de poster, et effectivement on y parle de pleins de problèmes liés à la casse (pas étonnant) mais je n'ai réussi à trouver aucune info utile concernant mon problème qui est très spécifique et que j'ai l'impression d'être le seul à avoir ...

    En continuant à m'acharner sur mon SQL, j'ai découvert que ce problème semble lié au fait que ma requête porte sur une vue :
    en effet, en faisant une requête du même type (avec un like), sur le même champ, mais portant sur la table d'origine au lieu de porter sur la vue, ça marche bien, sans problème de casse ...

    Quelqu'un sait comment rendre ma vue insensible à la casse ?
    Une config serveur ? une clause particuliere lors de la création de la vue ? ...

    Merci d'avance

  4. #4
    Membre régulier Avatar de jp_rennes
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2006
    Messages : 72
    Points : 86
    Points
    86
    Par défaut
    Je te confirme que par défaut le like est insensible à la casse.
    Va voir http://dev.mysql.com/doc/refman/5.0/...nsitivity.html

  5. #5
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Oui, c'est ce qui m'étonne le plus, car je n'ai pas modifié la config par défaut de mysql.
    Je n'ai pas réussi à élucider ce mystère, mais j'ai finalement pu m'en tirer grâce à LOWER()
    Quand je faisais cela, ça ne marchait pas (enfin, du moins ça tenait compte de la casse) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT id_document, identifiant_meta 
    FROM vue_moteur_recherche 
    WHERE (identifiant_meta = 'format' AND LOWER(valeur_meta) LIKE LOWER('%Word%')) )
    Donc à la place, j'ai re-créé la vue en mettant des LOWER() sur tous les champs que je sélectionne lors de la création de la vue.
    Puis, lorsque je fais ma requête sur ma vue, je réduis 'Word' en minuscule (en PHP) avant d'envoyer la requete.

    Et comme ça, ça marche

    Mais bon, c'est du bricolage ...

  6. #6
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Peut-être que le passage par une vue fait perdre le status de chaine de caractères... en tout cas ça ressemble pas mal à un bug sur les vues si leur comportement diffère de celui des tables.

  7. #7
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Citation Envoyé par Sivrît
    Peut-être que le passage par une vue fait perdre le status de chaine de caractères...
    C'est ce que je me suis dit aussi en constatant ce comportement, en tout cas ça en a tout l'air ...
    Citation Envoyé par Sivrît
    en tout cas ça ressemble pas mal à un bug sur les vues si leur comportement diffère de celui des tables
    Là personellement, je ne m'y connais pas suffisament en MySQL pour pouvoir dire si c'est un bug ou un problème de config ou si c'est normal.

Discussions similaires

  1. Comment créer une contrainte UNIQUE insensible à la casse ?
    Par pavlo_id dans le forum Administration
    Réponses: 3
    Dernier message: 08/02/2011, 14h53
  2. Réponses: 3
    Dernier message: 22/09/2005, 10h34
  3. Réponses: 10
    Dernier message: 30/06/2005, 12h20
  4. Réponses: 6
    Dernier message: 24/03/2005, 14h29

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