Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/11/2006, 10h32   #1
Invité de passage
 
Inscription : novembre 2004
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 12
Points : 2
Points : 2
Par défaut Sélection avec IN

Bonjour,

Ma base de données MySql est alimentée par diverses sources dont je n'ai pas forcement le contrôle. Résultat des courses, pour certaines informations qui s'y trouvent, j'ai des caractères invisibles (ou spéciaux - j'ai du mal à les identifier) qui viennent fausser mes résultats de requête.

Je vous explique : je fais un SELECT sur une liste d'emails (via un IN).

ex : SELECT * FROM inscrit WHERE email IN ('email1@test.fr','email2@test.fr','email3@test.fr','email4@test.fr')

Ma requête va par exemple me sortir les résultat pour email1, email2 et email3, mais rien pour email4@test.fr

Pour vérifier je fais un SELECT sur email='email4@test.fr' et en effet je n'ai rien. Par contre si je fais email LIKE '%email4@test.fr%', là j'ai des résultats.

Dans mon PHPMyAdmin, la valeur apparaît bien sous email4@test.fr. J'ai donc l'impression qu'il y a des caractères spéciaux invisibles qui l'entourent.

Le problème est que je suis obligé de passer par un IN car je dois pouvoir traiter un grand nombre d'emails.

J'aimerais donc savoir de quelle alternative je dispose (l'idéal serait un mix entre IN et LIKE). Auriez-vous une solution à me proposer.

Pour info ma donnée email est un varchar(255)

Merci d'avance
biggief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2006, 10h56   #2
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Salut

Dans un premier temps je passerais les fonctions ltrim et rtrim sur ton champs email

LTRIM(str) permet de faire sauter les espaces initiaux
RTRIM(str) permet de faire sauter les espaces finaux

D'ailleurs pour savoir si c'est bien les espaces qui te posent problème, recherche
select * from table
where email like ' email4@... ' ( j'ai rajouter des espaces pour voir si c'est ca !!!)

Sinon j'ai pa trop d'idées!!!
Bonne chance
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2006, 12h33   #3
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
Si vous souhaitez supprimer tous les espaces initiaux et finaux, sous MySQL la fonction TRIM existe.

Pour corriger le problème à court terme, exécutez la requête :

Code :
UPDATE TABLE SET EMAIL=TRIM(EMAIL)
Pour corriger le problème à moyen terme, revoyez votre script qui va lancer l'insertion de données. Vérifiez que les données sont correctement formatées et donc qu'un trim($mail) (exemple php) est bien executé avant l'insertion.

Pour corriger le problème sur du plus long terme, pour tous vos développement, avant chaque interraction avec votre base, vérifiez toujours les données (absence de séparateurs type ' " , absence d'espace superflus)
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2006, 15h44   #4
Invité de passage
 
Inscription : novembre 2004
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 12
Points : 2
Points : 2
Merci pour vos réponses, je vais tester toutes ces pistes.
biggief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2006, 11h28   #5
Invité de passage
 
Inscription : novembre 2004
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 12
Points : 2
Points : 2
J'ai identifié les caractères superflues. Il s'agit de \r\n.

Du coup j'ai réadapté ma requête comme ceci :

SELECT * FROM inscrit WHERE REPLACE(email,'\r\n','') IN ('email1@test.fr','email2@test.fr','email3@test.fr','email4@test.fr')

Il semblerait que cela fonctionne.

Que pensez-vous de cette solution ?
biggief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2006, 12h05   #6
Membre Expert
 
Avatar de Alexandre T
 
Inscription : mai 2002
Messages : 1 022
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 1 022
Points : 1 123
Points : 1 123
Elle est moins bonne que les TRIM. Trim virent les espaces superflus (y compris les retour chariot et retour lignes)
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2006, 15h51   #7
Invité de passage
 
Inscription : novembre 2004
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 12
Points : 2
Points : 2
Je suis également convaincu que TRIM est une solution plus logique, mais malheureusement, il s'avère qu'elle ne corrige le problème de ma requête ... email4@test.fr n'est pas trouvé (comme au départ)
biggief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2006, 16h23   #8
Invité de passage
 
Inscription : novembre 2004
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 12
Points : 2
Points : 2
Bon, au final, j'ai nettoyé toute ma base en faisant un update sur les infos email.

Le TRIM ne m'apportant pas les résultats escomptés, j'ai fait un REPLACE(email,'\r\n','')

Merci à tous pour votre aide.
biggief est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h34.


 
 
 
 
Partenaires

Hébergement Web