Bonjour à tous.

J’essaie de vous présenter la situation : j’ai une table listant l’ensemble des devises monétaires.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
CREATE TABLE devises (
  iddevise INTEGER UNSIGNED NOT NULL,
  symboleDevise VARCHAR(3) NOT NULL,
  libelleDevise VARCHAR(50) NOT NULL,
  PRIMARY KEY(iddevise)
)
TYPE=InnoDB;
Le symbole de la devise est un varchar(3) issu d’une norme officielle.
Cependant ma base de données est alimentée par différentes sources et notamment un fichier texte n’utilisant pas cette norme où 1 espace représente par défaut le symbole du franc et 3 espaces représente un montant multi-devise.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
INSERT INTO devises (iddevise, symboleDevise, libelleDevise)
  VALUES (1, ' ', 'francs');
INSERT INTO devises (iddevise, symboleDevise, libelleDevise)
  VALUES (2, '   ', 'multi-devises');
Mon problème se situe à la consultation, lorsque j’effectue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT libelleDevise FROMdevises
WHERE symboleDevise = ‘ ’ ; (avec un seul espace ce qui attend comme retour francs)
Il me renvoie la ligne francs mais aussi la ligne multi-devises. (Même chose si je mets trois espaces qui attend comme retour multi-devises)

Bon, admettons…mais là où je ne comprends pas c’est lorsque j’effectue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT libelleDevise FROMdevises
WHERE symboleDevise = ‘ ’
   AND LENGTH(symboleDevise) = 3;
Il me renvoie à nouveau ces deux mêmes lignes ! On a l’impression qu’il ne prend pas en compte le LENGTH.
Alors que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT *
FROM devises
WHERE LENGTH(symboleDevise) = 3;
me renvoie bien uniquement la ligne multi-devises.

Seul moyen d’obtenir le résultat que j’attends :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
SELECT *
FROM devises
WHERE idDevise IN (SELECT idDevise FROM devises WHERE symboleDevise = '')
  AND LENGTH(symboleDevise) = 3;
il me renvoie bien uniquement la ligne multi-devises

Voilà, si quelqu’un pouvait m’expliquer la subtilité…

Merci

NB : version 5.0 de mySQL server.