web-dev-qa-db-fra.com

Champs de sélection MySQL contenant des espaces de début ou de fin

Je peux utiliser la méthode MySQL TRIM() pour nettoyer les champs contenant des espaces blancs de début ou de fin avec un UPDATE comme ceci:

UPDATE Foo SET field = TRIM(field);

J'aimerais vraiment voir les champs que cela aura un impact avant que cela ne soit exécuté. J'ai essayé mais retourne 0 résultat:

SELECT * FROM Foo WHERE field != TRIM(field);

Il semble que cela devrait fonctionner, mais ce n'est pas le cas.

Quelqu'un a une solution? Aussi, curieux de savoir pourquoi cela ne fonctionne pas ...

25
Michael Irey

Comme indiqué sous Les types CHAR et VARCHAR :

Tous les classements MySQL sont de type PADSPACE. Cela signifie que toutes les valeurs CHAR et VARCHAR dans MySQL sont comparées sans tenir compte des espaces de fin.

Dans la définition de l'opérateur LIKE , le manuel indique:

En particulier, les espaces de fin sont significatifs, ce qui n'est pas vrai pour les comparaisons CHAR ou VARCHAR effectuées avec = opérateur:

Comme mentionné dans cette réponse :

Ce comportement est spécifié dans SQL-92 et SQL: 2008. À des fins de comparaison, la chaîne la plus courte est complétée à la longueur de la chaîne la plus longue.

Extrait du projet (8.2 <prédicat de comparaison>):

Si la longueur en caractères de X n'est pas égale à la longueur en caractères de Y, la chaîne plus courte est effectivement remplacée, à des fins de comparaison, par une copie d'elle-même qui a été étendue à la longueur de la chaîne plus longue par concaténation à droite d'un ou plusieurs caractères de pad, où le caractère de pad est choisi en fonction de CS. Si CS a la caractéristique NO PAD, alors le caractère de remplissage est un caractère dépendant de l'implémentation différent de n'importe quel caractère dans le jeu de caractères de X et Y qui rassemble moins que n'importe quelle chaîne sous CS. Sinon, le caractère du tampon est un <espace>.

Une solution:

SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
48
eggyal
SELECT *
FROM 
    `foo`
WHERE 
   (name LIKE ' %')
OR 
   (name LIKE '% ')
29
user4035

Voici un exemple avec RegEx

SELECT *
FROM 
    `foo`
WHERE 
   (name REGEXP '(^[[:space:]]|[[:space:]]$)')
1
EpixRu