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

Requêtes MySQL Discussion :

Sensibilité à la casse - commande LIKE


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Sensibilité à la casse - commande LIKE
    Bonjour, -soir,

    Après de nombreuses recherches vaines sur le net, je me résous à poser ici une question -sans doute- très basique concernant une commande SQL qui ne retourne pas le résultat attendu. Pour information, j'utilise MySQL dans sa version 5.0.27.


    Pour l'exemple, supposons que ma base de données ne contient qu'une table 'articles' avec un champ 'id' et un champ 'title'. Le contenu de la table se compose des enregistrements suivants:

    id title
    -----------------------------------
    1 test.mySQL1
    2 test.mySql2
    3 test.mysql3


    Ma 1ère commande (cf ci-dessous) retourne le résultat attendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    mysql> SELECT title FROM articles WHERE title LIKE '%est.my%' ORDER BY id DESC;
    +-------------+
    | title             
    +-------------+
    | test.mysql3   
    | test.mySql2  
    | test.mySQL1 
    +-------------+
    3 rows in set (0.00 sec)
    Or, si je change la 1ère sélection afin d'y intégrer le 's' (en minuscule), je n'obtiens plus qu'un seul enregistrement alors que je m'attendais à avoir le même résultat que précédemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    mysql> SELECT title FROM articles WHERE title LIKE '%est.mys%' ORDER BY id DESC;
    +-------------+
    | title       
    +-------------+
    | test.mysql3 
    +-------------+
    1 row in set (0.00 sec)
    Ayant lu à plusieurs reprises (e.g. http://dev.mysql.com/doc/refman/5.0/...nsitivity.html ) que, par défaut, les recherches de MySQL ne sont pas sensibles à la casse (i.e. le jeu de caractères que j'utilise sont soit 'latin1_german1_ci' ou 'utf8_bin'), j'en viens à mettre en doute de telles affirmations.


    Soupçonnant qu'il y a un paramètre que j'ai dû omettre ou je ne sais quoi d'autre, je remercie d'avance quiconque serait en mesure de me fournir un indice ou une réponse complète sur le sujet.


    Loris

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Citation Envoyé par loris
    Ayant lu à plusieurs reprises (e.g. http://dev.mysql.com/doc/refman/5.0/...nsitivity.html ) que, par défaut, les recherches de MySQL ne sont pas sensibles à la casse (i.e. le jeu de caractères que j'utilise sont soit 'latin1_german1_ci' ou 'utf8_bin'), j'en viens à mettre en doute de telles affirmations.
    "par défaut" ne veut pas dire "dans tous les cas de figure". En fait,
    ça dépend de ta collation. latin1_german1_ci est insensible (ci = case insensitive), mais utf8_bin est sensible (bin = binaire). Par défaut, MySQL est en latin1_swedish_ci, et donc par défaut insensible à la casse...

    La requête suivante doit fonctionner si ta colonne est en utf8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT title 
    FROM articles 
    WHERE title 
    LIKE '%est.mys%' COLLATE utf8_unicode_ci 
    ORDER BY id DESC;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Merci énormément pour la prompte réponse.

    Je vais investiguer de ce côté-là et reviendrai rapidement pour donner un 'feed-back'.

    A plus!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Me revoilà...! J'ai essayé les 2 commandes suivantes avec les résultats correspondants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT title 
    FROM articles 
    WHERE title 
    LIKE '%est.mys%' 
    COLLATE latin1_german1_ci 
    ORDER BY id DESC;
    
    mysql> SELECT title FROM articles WHERE title LIKE '%est.mys%' 
    COLLATE latin1_german1_ci ORDER BY id DESC; 
    ERROR 1267 (HY000): Illegal mix of collations (utf8_bin,IMPLICIT) and 
    (latin1_german1_ci,EXPLICIT) for operation 'like'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT title 
    FROM articles 
    WHERE title 
    LIKE '%est.mys%' 
    COLLATE utf8_unicode_ci 
    ORDER BY id DESC;
    
    mysql> SELECT title FROM articles WHERE title LIKE '%est.mys%' 
    COLLATE utf8_unicode_ci ORDER BY id DESC;
    ERROR 1253 (42000): COLLATION 'utf8_unicode_ci' is not valid for 
    CHARACTER SET 'latin1'
    Les paramètres de ma base de données sont les suivants:

    Jeu de caractères pour MySQL: UTF-8 Unicode (utf8) [a]

    Interclassement:
    .> pour la connexion MySQL: latin1_german1_ci
    ...> base de données: latin1_german1_ci
    .....> table 'articles': utf8_bin
    .......> champ 'id': vide
    .......> champ 'title': utf8_bin [b]

    Bien que j'aie essayé de 'jouer' avec ces paramètres, je n'arrive toujours à rien et j'ai vraiment l'impression qu'il faut que tous ceux-ci soit identiques afin que cela marche mais il semble que je ne puisse changer les jeux de caractères pour MySQL [a] et pour le champ concerné [b].

    Quelqu'un peut-il confirmer qu'il faut bien que tous ces paramètres fassent référence à un seul et unique jeu de caractères et, si oui, quel serait le meilleur sachant que je vais stocker du texte en français (avec accents) dans ma base de données?

    D'avance merci pour tout commentaire ou avis sur la question!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Oups...
    Désolé Autoun!

    Je viens à l'instant de réaliser que le lien que tu avais mentionné dans ton message précédent (i.e. http://antoun.developpez.com ) faisait référence à un document expliquant, entre autres, la collation en long et en large. Je vais le lire dès que possible et je devrais être plus intelligent ensuite. Et, sans doute, être capable de répondre moi-même à mes précédentes questions.

    A plus!

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    pour te donner tout de suite la réponse au message d'erreur, c'est parce que j'ai mal placé mon LIKE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT title FROM articles WHERE title COLLATE utf8_unicode_ci LIKE '%est.mys%' 
    ORDER BY id DESC;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Merci...!
    Merci mille fois pour l'aide apportée. Au-delà de mes attentes, mon petit problème est résolu très rapidement et -surtout- j'ai appris beaucoup en lisant le document suggéré par Autoun que je recommande à tout le monde.

    Si je dois un jour acheter un livre sur MySql 5, je sais d'ores et déjà que cela sera celui écrit par Antoine Dinimant (i.e. ISBN : 978-2-7429-6873-2).

    Meilleures salutations.

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

Discussions similaires

  1. [MySQL] Recherche "LIKE" et sensibilité à la casse
    Par Loïc dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 29/01/2012, 16h22
  2. Tri par ordre alpha, sensibilité à la casse
    Par linou dans le forum Oracle
    Réponses: 2
    Dernier message: 30/09/2005, 15h45
  3. commande LIKE
    Par cyrill.gremaud dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/09/2005, 14h21
  4. MSSQL et sensibilité à la casse
    Par mortalzoom dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 11/07/2005, 15h31
  5. Synthaxe pour expression comprenant quote avec commande like
    Par loopy4321 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/07/2004, 13h21

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