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 :

Effectuer une recherche "case insensitive" mais "accent sensitive"


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut Effectuer une recherche "case insensitive" mais "accent sensitive"
    Bonjour à tous !

    Comme indiqué dans le titre je cherche à réaliser une recherche (LIKE) sur des champs en étant à la fois "case insensitive" mais "accent sensitive".

    Actuellement j'ai testé d'utiliser les codages suivants :
    jeu de caractères : latin1
    collation : latin1_general_cs (les 2 sont sensitives) ou latin1_general_ci (les 2 sont insensitives)

    Je n'arrive donc pas à obtenir mes 2 contraintes simultanément.

    Je n'ai pas à réussi trouver si d'autres codages pourraient faire l'affaire ou s'il y a une astuce pour s'en sortir, je me remets donc à votre expérience

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si j'en crois SQLPro, ce n'est pas possible avec MySQL, c'est une de ces grosses lacunes.
    D'après la doc MySQL, c'est soit ci, soit cs, soit bin ; ce dernier étant sensible aux accents et à la casse.

    A moins que ce soit possible avec un WHERE double avec l'instruction COLLATE ? Je n'ai jamais essayé.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    A moins que ce soit possible avec un WHERE double avec l'instruction COLLATE ? Je n'ai jamais essayé.
    le problème c'est que dans ce cas, il me semble que, j'obtiendrai plus de résultats qu'escompté. De plus le résultat du requête WHERE avec COLLATE x_cs me parait être inclus dans celui de la même requête WHERE avec COLLATE x_ci, non ?

    Au final mon problème réside dans le fait, qu'avec le jeu de caractères que j'utilise, case sensitive = accent sensitive. Si quelqu'un connait un jeu de caractères (avec la collation adéquate) qui ne pose pas ce problème, je suis preneur
    Toute requête, même farfelue, menant au même résultat sera évidemment aussi bienvenue.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Mon idée allait plutôt dans le sens d'un WHERE COLLATE x_cs OR COLLATE x_ci mais encore une fois je n'ai jamais été confronté à ce problème alors je ne sais pas si c'est possible.
    Donne ta requête, on verra ce qu'on peut imaginer de concret
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Merci pour ton aide.

    Je n'ai pas de requête en particulier, mais tu peux imaginer ce genre de choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT mot FROM ma_table WHERE mot LIKE 'toto%';
    Il faudrait que j'ai les mêmes résultats que j'ai toto ou Toto, mais pas si j'ai tôto. Est-ce plus clair ?

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Quelques tests...

    Dans la table, j'ai une ligne où name = 'Philippe Leménager' (avec capitales, minuscules, accent). L'interclassement de la table est utf8_unicode_ci

    Recherche stricte avec accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
    FROM users
    WHERE name = 'Philippe Leménager'
    => Philippe Leménager

    Recherche sans accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
    FROM users
    WHERE name = 'Philippe Lemenager'
    => Philippe Leménager

    Recherche en mettant la colonne en minuscules et avec accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
     FROM users
     WHERE LOWER(name) = 'Philippe Leménager'
    => Philippe Leménager

    Recherche en mettant la colonne en minuscules et sans accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
      FROM users
      WHERE LOWER(name) = 'Philippe Lemenager'
    => Philippe Leménager

    Recherche en mettant la colonne en capitales et avec accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
      FROM users
      WHERE UPPER(name) = 'Philippe Leménager'
    => Philippe Leménager

    Recherche en mettant la colonne en capitales et sans accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
       FROM users
       WHERE LOWER(name) = 'Philippe Lemenager'
    => Philippe Leménager


    Recherche avec COLLATE avec accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
     FROM users
     WHERE name = 'Philippe Lemenager' COLLATE utf8_bin
    => Philippe Leménager

    Recherche avec COLLATE sans accent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
    FROM users
    WHERE name = 'Philippe Lemenager' COLLATE utf8_bin
    => MySQL n'a retourné aucun enregistrement.

    Recherche avec COLLATE avec accent et mise en capitales de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
      FROM users
      WHERE UPPER(name) = 'Philippe Lemenager' COLLATE utf8_bin
    => MySQL n'a retourné aucun enregistrement.

    Recherche avec COLLATE sans accent et mise en capitales de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
     FROM users
     WHERE UPPER(name) = 'Philippe Lemenager' COLLATE utf8_bin
    => MySQL n'a retourné aucun enregistrement.

    Recherche avec COLLATE avec accent et mise en minuscules de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
       FROM users
       WHERE LOWER(name) = 'Philippe Lemenager' COLLATE utf8_bin
    => MySQL n'a retourné aucun enregistrement.

    Recherche avec COLLATE sans accent et mise en minuscules de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name
      FROM users
      WHERE LOWER(name) = 'Philippe Lemenager' COLLATE utf8_bin
    => MySQL n'a retourné aucun enregistrement.

    Fais des tests de ce genre avec tes données, tu devrais pouvoir arriver à obtenir ce que tu cherches.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    utf8_bin est à mon avis la collation la plus contraignante, car elle va comparer les champs de bits complet => collation sensitive à tous les niveaux, donc pas appropriée à mon cas.

    Par contre pour que mon appli soit multilingue je vais devoir passer en unicode, donc autant le faire dès maintenant et passer à l'utf8 (faute de pouvoir passer en utf16 ...) et faire qqs tests. Au final vu les énormes lacunes de MySQL je sens que je vais finir tout simplement par changer de SGBD ...

    Merci pour l'aide en tout cas.
    Je repasserai pour faire état de ce à quoi je serai arrivé.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 021
    Billets dans le blog
    6
    Par défaut
    De toute façon les lacunes de MySQL sont elle qu'il es t inexploitable pour des besoins professionnels !
    Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

    En revanche PostGreSQL est bien plus pro !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [VBA-Excel] Effectuer une recherche dans une liste view
    Par Miles Raymond dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/11/2006, 18h21
  2. Comment effectuer une recherche dans une listBox?
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 19/05/2006, 17h15
  3. liste deroulante pour effectuer une recherche
    Par pierrot67 dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/04/2006, 10h27
  4. Effectuer une recherche avec jEdit
    Par lyon72 dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 3
    Dernier message: 04/04/2006, 19h44
  5. une requete effectuant une recherche sur tous les champs
    Par raynor911 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/02/2006, 16h06

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