instr - trim mysql que hace
MySQL selecciona campos que contienen espacios en blanco iniciales o finales (2)
Como se documenta en los tipos CHAR
y VARCHAR
:
Todas las colaciones de MySQL son de tipo
PADSPACE
. Esto significa que todos los valores deCHAR
yVARCHAR
en MySQL se comparan sin tener en cuenta los espacios finales.
En la definición del operador LIKE
, el manual establece:
En particular, los espacios finales son significativos, lo que no es cierto para las comparaciones
CHAR
oVARCHAR
realizadas con el operador=
:
Como se menciona en esta respuesta :
Este comportamiento se especifica en SQL-92 y SQL: 2008. A efectos de comparación, la cadena más corta se rellena con la longitud de la cadena más larga.
Del borrador (8.2 <predicado de comparación>):
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 relleno, donde el carácter de relleno se elige en función de CS. Si CS tiene la característica NO PAD, entonces el carácter de relleno es un carácter dependiente de la implementación diferente de cualquier carácter en el conjunto de caracteres de X e Y que clasifica menos que cualquier cadena bajo CS. De lo contrario, el carácter de relleno es un <space>.
Una solución:
SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
Puedo usar el método MySQL TRIM()
para limpiar los campos que contienen espacios en blanco iniciales o finales con una UPDATE
como la siguiente:
UPDATE Foo SET field = TRIM(field);
Me gustaría ver los campos en los que esto afectará antes de que se ejecute. Intenté esto pero devuelve 0 resultados:
SELECT * FROM Foo WHERE field != TRIM(field);
Parece que esto debería funcionar pero no lo hace.
¿Alguien tiene una solución? Además, curiosidad por qué esto no funciona ...
SELECT *
FROM
`foo`
WHERE
(name LIKE '' %'')
OR
(name LIKE ''% '')