MySQL select champs contenant l'espace principal ou arrière
je peux utiliser le MySQL TRIM()
méthode pour nettoyer les champs contenant un espace de début ou de fin avec un UPDATE
comme ceci:
UPDATE Foo SET field = TRIM(field);
j'aimerais vraiment voir les champs, cela aura un effet avant d'exécuter. J'ai essayé ceci mais renvoie 0 résultats:
SELECT * FROM Foo WHERE field != TRIM(field);
on dirait que ça devrait marcher mais ça ne marche pas.
Quelqu'un a une solution? Aussi, curieux de savoir pourquoi cela ne fonctionne pas...
2 réponses
comme indiqué sous CHAR
et VARCHAR
Types:
toutes les collations MySQL sont de type
PADSPACE
. Cela signifie que tous lesCHAR
et
Dans la définition de la LIKE
opérateur, le manuel indique:
En particulier, les espaces sont importants, ce qui n'est pas vrai pour
CHAR
ouVARCHAR
comparaisons effectuées avec les=
opérateur:
Comme indiqué dans le cette réponse:
ce comportement est spécifié dans SQL-92 et SQL:2008. Pour fins de comparaison, la plus courte chaîne collier à la longueur de la plus longue chaîne.
dans le projet (8.2
): Si la longueur en caractères de X n'est pas égale à la longueur en caractères de Y, alors la chaîne plus courte est effectivement remplacée, pour les besoins de la comparaison, avec une copie de lui-même qui a été étendue à la longueur de la chaîne plus longue par concaténation sur la droite d'un ou plusieurs caractères pad, où le caractère pad est choisi basé sur CS. Si CS a la caractéristique no PAD, alors le caractère pad est un caractère dépendant de la mise en œuvre différent de n'importe quel caractère dans le jeu de caractères de X et Y ça collate moins que n'importe quelle chaîne sous CS. Sinon, le caractère de remplissage est un
.
une solution:
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
SELECT *
FROM
`foo`
WHERE
(name LIKE ' %')
OR
(name LIKE '% ')