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 :

MySQL ne fait pas la différence entre "e" et "ë" [MySQL-5.1]


Sujet :

Requêtes MySQL

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut MySQL ne fait pas la différence entre "e" et "ë"
    Bonjour,

    j'ai deux tables contenant des identités. Elles sont sensées contenir les même personnes mais parfois il y a des erreurs dans l'orthographe des prénoms ou noms. Pour TOTO, le prénom est "Mikael" dans table1, et "Mikaël" dans table2. Pour MySQL les deux prénoms sont identiques.
    La requête suivante ne retourne rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT table1.CODE, table2.EMP_NOM, table2.EMP_PRENOM, table1.NOM_USUEL, table1.PRENOM
    FROM table2 
    	INNER JOIN table1 ON table2.EMP_MATRICULE_COURT = table1.CODE
    WHERE (table1.NOM_USUEL <> table2.EMP_NOM 
     OR table1.PRENOM <> table2.EMP_PRENOM)
    AND table1.NOM_USUEL = 'TOTO'
    Alors que celle-ci retourne : 123456 TOTO Mikael TOTO Mikaël
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT table1.CODE, table2.EMP_NOM, table2.EMP_PRENOM, table1.NOM_USUEL, table1.PRENOM
    FROM table2 
    	INNER JOIN table1 ON table2.EMP_MATRICULE_COURT = table1.CODE
    WHERE table1.PRENOM = table2.EMP_PRENOM
    AND table1.NOM_USUEL = 'TOTO'
    Y a-t-il dans les paramétrages de MySQL une option pour l'obliger à faire la différence entre un caractère et sa version accentuée ?

    Édition : les tables sont créées avec l'option "ENGINE=InnoDB DEFAULT CHARSET=latin1".
    Christophe

    Pensez à mettre quand c'est le cas.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Tout dépend de la collation avec laquelle vous avez créé vos bases, tables, colonnes, etc....

    A me lire : http://blog.developpez.com/sqlpro/p1..._grand_folklor

    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/ * * * * *

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Lecture intéressante en effet, même si cela fait peur.
    Toutes les colonnes (de type varchar) de la base ont pour collation latin1_swedish_ci.
    Y a-t-il un moyen de changer la collation sur une colonne le temps d'une requête ?
    Si oui, quelle serait la collation la mieux adaptée pour mon problème ?
    Christophe

    Pensez à mettre quand c'est le cas.

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Christophe P.

    J'utilise aussi le 'latin1' pour mes bases de données.

    Voici ce que nous avons à notre disposition dans le serveur MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    --------------
    SHOW COLLATION LIKE 'latin1%'
    --------------
     
    +-------------------+---------+----+---------+----------+---------+
    | Collation         | Charset | Id | Default | Compiled | Sortlen |
    +-------------------+---------+----+---------+----------+---------+
    | latin1_german1_ci | latin1  |  5 |         | Yes      |       1 |
    | latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       1 |
    | latin1_danish_ci  | latin1  | 15 |         | Yes      |       1 |
    | latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
    | latin1_bin        | latin1  | 47 |         | Yes      |       1 |
    | latin1_general_ci | latin1  | 48 |         | Yes      |       1 |
    | latin1_general_cs | latin1  | 49 |         | Yes      |       1 |
    | latin1_spanish_ci | latin1  | 94 |         | Yes      |       1 |
    +-------------------+---------+----+---------+----------+---------+
    En résumé, il y a seulement 'latin1_general_ci' et 'latin1_general_cs'.

    Si tu veux faire la distinction entre les majuscules et les minuscules alors tu dois choisir : 'latin1_general_cS'.
    Si tu ne veux pas faire de distinction alors tu dois choisir : 'latin1_general_ci'.

    Juste une petite précision :
    --> ci : case insensitive (insensible à la casse).
    --> cs : case sensitive (sensible à la casse).

    Personnellement, j'ai choisi 'latin1_general_ci' car je trouve bien pratique que cela soit insensible à la casse.

    Tandis qu'il fait bien la distinction entre les accents graves, aigus, circonflexes, le tréma et la cédille (pour les deux collations). On nomme cela des signes diacritiques, et il y en a cinq.

    En ce qui concerne les ligatures (la fusion de deux caractères en un seul), comme le 'œ', ce caractère n'existe pas en ISO-8859-1 alors qu'il est présent en ISO-8859-15.
    La seule ligature qui est disponible en ISO-8859-1 est le 'æ', en hexa : 'E6' et en majuscule 'Æ', en hexa 'C6'.
    En français, les ligatures ont tendances à disparaître car ils sont difficiles d'accès au clavier.

    Pour modifier vos tables, vous devez tapez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table `test` convert to character set `latin1` collate `latin1_general_ci`;
    Il faudrait faire un inventaire de toutes les particularités qui ont été saisies dans vos tables. Par particularité, j'entends ce qui est différent de l'ASCII. Et voir si telle ou telle collation vous convient.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Merci à vous deux pour vos explications très claires. Et "pas merci" à MySQL pour sa "gestion" des collations.
    Christophe

    Pensez à mettre quand c'est le cas.

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

Discussions similaires

  1. je vois pas la différence entre ces 2 codes
    Par membreComplexe12 dans le forum C++
    Réponses: 2
    Dernier message: 09/08/2011, 18h41
  2. Réponses: 9
    Dernier message: 17/01/2011, 20h38
  3. Pas de différence entre onPress et onRelease
    Par supergrey dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 06/07/2007, 11h21
  4. Réponses: 1
    Dernier message: 20/06/2007, 17h03
  5. Ma chaîne SQL ne fait pas la différence entre un H et un h
    Par beegees dans le forum Requêtes et SQL.
    Réponses: 19
    Dernier message: 22/03/2006, 15h23

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