Solución:
Como se documenta en el CHAR
y VARCHAR
Tipos:
Todas las intercalaciones de MySQL son de tipo
PADSPACE
. Esto significa que todosCHAR
yVARCHAR
los valores en MySQL se comparan sin tener en cuenta los espacios finales.
En la definición de la LIKE
operador, el manual dice:
En particular, los espacios finales son significativos, lo que no es cierto para
CHAR
oVARCHAR
comparaciones realizadas con el=
operador:
Como se menciona en esta respuesta:
Este comportamiento se especifica en SQL-92 y SQL: 2008. Para fines de comparación, la cadena más corta se rellena con la longitud de la cadena más larga.
Desde el borrador (8.2
): Si la longitud en caracteres de X no es igual a la longitud en caracteres de Y, entonces la cadena más corta se reemplaza efectivamente, a efectos de comparación, con una copia de sí misma que se ha extendido a la longitud de la cadena más larga por concatenación. a la derecha de uno o más caracteres de almohadilla, donde el carácter de almohadilla se elige en función de CS. Si CS tiene la característica NO PAD, entonces el carácter de almohadilla es un carácter dependiente de la implementación diferente de cualquier carácter en el conjunto de caracteres de X e Y que coteja menos que cualquier cadena en CS. De lo contrario, el carácter del pad es un
.
Una solución:
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
SELECT *
FROM
`foo`
WHERE
(name LIKE ' %')
OR
(name LIKE '% ')
Aquí hay un ejemplo con RegEx
SELECT *
FROM
`foo`
WHERE
(name REGEXP '(^[[:space:]]|[[:space:]]$)')