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

MySQL Discussion :

Interclassement et doublons [MySQL-5.6]


Sujet :

MySQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut Interclassement et doublons
    Bonjour,

    J'ai besoin de créer une clé primaire sur une table "prospect", rubrique "code_prospect".
    Quand je tente de la créer, j'ai une erreur de doublon.
    Le moteur me détecte MÉCHMI et MECHMI comme des doublons.

    J'ai besoin que MÉCHMI et MECHMI soient considérés comme différents, mais que Mechmi et MECHMI soient considérés identiques.

    Je pense qu'il existe un interclassement capable de gérer ce cas, mais malgré pas mal de recherches et d'essais, je ne trouve pas.

    Savez-vous quel interclassement gère ça correctement ?

    Interclassement actuel : latin1_swedish_ci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Il est fortement déconseillé de créer une clef primaire sur une colonne significative (qui est un varchar qui plus est ...)

    De plus cette clef primaire manque de stabilité.
    Quid des cas d'un client qui change de nom suite à un mariage, ou qu'une coquille se soit inséré dans ce même nom ?


    Bref lisez cet article : http://sqlpro.developpez.com/cours/clefs/

    Ca ne résoudra pas le problème initiale, mais au moins ca sera un peu mieux modélisé.


    Pour le problème de collation vérifiez bien sous quelle collation est votre table / colonne / parametre par défault / etc...


    Une autre piste pour vérifier les égalités serai d'utiliser ce genre de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT STRCMP((SELECT ('Foo') COLLATE utf8_general_ci),(SELECT ('Föö') COLLATE utf8_general_ci));

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    La collation latin1_general_cs a l'air de faire le travail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT _latin1 "mechi" COLLATE latin1_general_cs = _latin1 "MECHI" COLLATE latin1_general_cs;
    # 0
    SELECT _latin1 "mechi" COLLATE latin1_general_cs = _latin1 "méchi" COLLATE latin1_general_cs;
    # 0
    SELECT _latin1 "mechi" COLLATE latin1_general_cs = _latin1 "mechi" COLLATE latin1_general_cs;
    # 1

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    essayez cp1256_general_ci

    Mais comme dit par Punkoff, c'est une mauvaise clef primaire, plutôt une clef alternative.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Mauvaise clé primaire... oui, mais je n'ai pas le choix !

    Cette base est la réplique (synchronisée) d'une base en Access.
    La clé primaire de la table dans Access est code_prospect.
    Elle est clé étrangère dans d'autres tables qui seront synchronisées aussi. (devis, commandes, etc.)

    Pour la latin1_general_cs, ça ne marche pas, enfin pas tout à fait.

    MySQL me repère bien MÉCHMI et MECHMI comme différents (ce que je veux),
    mais Mechmi et MECHMI sont aussi différents (ce que je ne veux pas).

    Il me faut trouver un interclassement sensible aux accentuations, mais pas à la casse.

    -----------------------------------------------------------------------------------------------------
    Méthode utilisée pour tester, après avoir fait le changement sur la rubrique code_prospect
    SELECT *
    FROM prospect
    --WHERE code_prospect = 'MECHMI' --> renvoie une ligne [ OK]
    --WHERE code_prospect = 'mechmi' --> ne renvoie pas de ligne [devrait en renvoyer une]
    --WHERE code_prospect = 'MÉCHMI' --> renvoie une ligne [OK]
    --WHERE code_prospect = 'Méchmi' --> ne renvoie pas de ligne [devrait en renvoyer une]

  6. #6
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Ah pardon, j'avais mal lu, donc il faut remplacer cs (case-sensitive) par ci (case-insensitive).

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Hum,

    En faisant des essais, j'ai vu l'infobulle sur les options de la liste déroulante.
    C'est latin1_general_ci qu'il fallait.
    L'infobulle dit "insensible à la casse".
    Le CI doit être pour "case insensitive".

    Mon problème est résolu, merci.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Posts croisés, merci Bisûnûrs.
    Tagué résolu.

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

Discussions similaires

  1. Requete de comptage de doublons spéciale
    Par COliveOnTheNet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2003, 10h11
  2. PB: Insertion de doublon
    Par maxvador dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/09/2003, 12h07
  3. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  4. tri a bulle sans les doublons
    Par comme de bien entendu dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/03/2003, 16h29
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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