Page 1 sur 1
Souci d'égalité
Posté : 20 juil. 2010, 11:43
par SinBert
Bonjour,
lorsque je fais une requête du style :
SELECT * WHERE name="Clémentine";
Et bien mysql me retourne correctement les info de "Clémentine", mais aussi celles de "Clementine" (sans l'accent sur le "e")
C'est assez problématique car je ne peux pas updater le champ "Clémentine" sans updater l'autre champ ! (Clementine)
Auriez vous une solution pour cela?
Merci d'avance.

Re: Souci d'égalité
Posté : 20 juil. 2010, 13:44
par Patriboom
C'est toujours très délicat de fonder des UPDATE sur des noms et - je crois - encore plus de le faire sur des prénoms. Combien de gens ont le même prénom!
Pour être vraiment sûr du résultat, rien ne vaut le travail sur un ID unique auto-incrémenté.
Je crains qu'en réglant ce cas, tu ne te crées plus de nouveaux problèmes que ne règles de cas.
Re: Souci d'égalité
Posté : 20 juil. 2010, 14:24
par SinBert
Bonjour,
je ne peux qu'admettre que tu as tout a fait raison. Cependant, il se trouve que la colonne "name" qui contient donc les noms ne contiendra jamais de doublons vu que ces noms sont enfaite des IGN issu d'un jeu vidéo en ligne. Il ne peut donc pas y avoir de doublons.
Pour la colonne ID, c'est se que je fais généralement, sur les autres tables. Mais encore une fois, je ne peux pas. Mon script va chercher les niveaux des joueurs sur le site officiel du jeu et ceci uniquement grâce à leur IGN. Je ne peux donc faire l'update qu'a partir de ceux ci.
Donc ma question reste la même : Comment faire pour que ma requête ne retourne pas "Clémentine" lorsque je lui demande "Clementine"?
Merci encore

Re: Souci d'égalité
Posté : 20 juil. 2010, 14:40
par Patriboom
Je viens d'essayer ceci dans PhpMyAdmin et j'obtiens le résultat voulu, j'en conclus que ce peut être bon pour vous:
SELECT *
FROM `personnes_noms`
WHERE `Prenom`
REGEXP 'Clémentine'
Bref: utiliser REGEXP à la place de = or de LIKE
Re: Souci d'égalité
Posté : 20 juil. 2010, 14:47
par stealth35
en quelle charset est ta colonne ?
Re: Souci d'égalité
Posté : 20 juil. 2010, 14:54
par Patriboom
J'ai oublié de mentionner que mon test a été fait en utf8_general_ci
Re: Souci d'égalité
Posté : 20 juil. 2010, 15:05
par stealth35
J'ai oublié de mentionner que mon test a été fait en utf8_general_ci
faudrait le passé en utf8_bin
Re: Souci d'égalité
Posté : 20 juil. 2010, 15:32
par Patriboom
Non, REGEXP fonctionne très bien avec UTF8_general
Re: Souci d'égalité
Posté : 20 juil. 2010, 15:44
par stealth35
Non, REGEXP fonctionne très bien avec UTF8_general
oui mais ca résout pas le problème ca le contourne
Re: Souci d'égalité
Posté : 20 juil. 2010, 16:02
par Patriboom
Je vais laisser SinBert juger si ça résout ou non son problème. À mon avis oui. Si SinBert obtient ainsi le résultat recherché, quoi chercher de plus?
Re: Souci d'égalité
Posté : 20 juil. 2010, 16:07
par stealth35
Je vais laisser SinBert juger si ça résout ou non son problème. À mon avis oui. Si SinBert obtient ainsi le résultat recherché, quoi chercher de plus?
quelque chose de plus officiel et plus optimisé ?
Re: Souci d'égalité
Posté : 20 juil. 2010, 20:09
par SinBert
Il est clair que le plus optimisé sera le mieux ; mais pour l'instant, la question en n'est toujours pas réglée.
En effet, je viens d'essayer avec les REGEX, mais ça ne fonctionne toujours pas.
je crois avoir identifié le problème :
lorsque je fait la requête suivante :
SELECT * FROM `mf_ranking` WHERE name REGEXP 'Clémentine'
La requête qui est appliquée est celle-ci :
SELECT * FROM `mf_ranking` WHERE name REGEXP 'Clémentine'
Donc fatalement, ça foire.
Que faire pour y remédier?
Merci encore.

Re: Souci d'égalité
Posté : 20 juil. 2010, 22:06
par Ryle
Sinon pour répondre à ta question initiale, avec MySQL les valeurs dans les colonnes CHAR et VARCHAR sont classées et comparées sans tenir compte de la casse (majuscule/minuscule mais également accent : e é et E sont donc identiques).
Pour éviter cela, il faut que l'attribut BINARY soit spécifié lors de la création de la table

Re: Souci d'égalité
Posté : 20 juil. 2010, 23:35
par stealth35
Sinon pour répondre à ta question initiale, avec MySQL les valeurs dans les colonnes CHAR et VARCHAR sont classées et comparées sans tenir compte de la casse (majuscule/minuscule mais également accent : e é et E sont donc identiques).
enfaite y'a une table de correspondance derrière c'est pour ca que y'a plusieurs type de charset dans mysql, parce que de l'utf-8 c'est de l'utf-8 et y'en a qu'un seul, mysql a plusieurs table de correspondance suivant les langues qui permettent de dire e = é = è = E
Pour éviter cela, il faut que l'attribut BINARY soit spécifié lors de la création de la table

on peu rajouter BINARY dans la requete
SELECT name FROM table WHERE truc = BINARY 'héhé';
et la on aura que les "héhé" et pas les "hehe", par contre en binary c'est case-sensitive
Il est clair que le plus optimisé sera le mieux ; mais pour l'instant, la question en n'est toujours pas réglée.
En effet, je viens d'essayer avec les REGEX, mais ça ne fonctionne toujours pas.
je crois avoir identifié le problème :
lorsque je fait la requête suivante :
SELECT * FROM `mf_ranking` WHERE name REGEXP 'Clémentine'
La requête qui est appliquée est celle-ci :
SELECT * FROM `mf_ranking` WHERE name REGEXP 'Clémentine'
Donc fatalement, ça foire.
Que faire pour y remédier?
Merci encore.

vérifie bien le charset des connections :
character set client
character set connection
collation connection