Souci d'égalité

Eléphant du PHP | 109 Messages

20 juil. 2010, 11:43

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. :)
ANSI <font> <font> <font> <li> <p> <title> Mar I/O .NET

Mammouth du PHP | 881 Messages

20 juil. 2010, 13:44

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.
Soyez artisans de paix

Eléphant du PHP | 109 Messages

20 juil. 2010, 14:24

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 ;)
ANSI <font> <font> <font> <li> <p> <title> Mar I/O .NET

Mammouth du PHP | 881 Messages

20 juil. 2010, 14:40

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
Soyez artisans de paix

ViPHP
ViPHP | 5462 Messages

20 juil. 2010, 14:47

en quelle charset est ta colonne ?

Mammouth du PHP | 881 Messages

20 juil. 2010, 14:54

J'ai oublié de mentionner que mon test a été fait en utf8_general_ci
Soyez artisans de paix

ViPHP
ViPHP | 5462 Messages

20 juil. 2010, 15:05

J'ai oublié de mentionner que mon test a été fait en utf8_general_ci
faudrait le passé en utf8_bin

Mammouth du PHP | 881 Messages

20 juil. 2010, 15:32

Non, REGEXP fonctionne très bien avec UTF8_general
Soyez artisans de paix

ViPHP
ViPHP | 5462 Messages

20 juil. 2010, 15:44

Non, REGEXP fonctionne très bien avec UTF8_general
oui mais ca résout pas le problème ca le contourne

Mammouth du PHP | 881 Messages

20 juil. 2010, 16:02

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?
Soyez artisans de paix

ViPHP
ViPHP | 5462 Messages

20 juil. 2010, 16:07

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é ?

Eléphant du PHP | 109 Messages

20 juil. 2010, 20:09

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. ;)
ANSI <font> <font> <font> <li> <p> <title> Mar I/O .NET

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juil. 2010, 22:06

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 5462 Messages

20 juil. 2010, 23:35

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