Este comportamiento es por diseño, no solo en MySQL.
Puede solucionarlo en comparaciones usando BINARY
:
mysql> select version(), 'a' = 'a ', BINARY 'a' = BINARY 'a ';
+-------------+------------+--------------------------+
| version() | 'a' = 'a ' | BINARY 'a' = BINARY 'a ' |
+-------------+------------+--------------------------+
| 5.5.25a-log | 1 | 0 |
+-------------+------------+--------------------------+
1 row in set (0.00 sec)
pero no mucho más. Esto te ayudará con SELECT
s si aparecen espacios en blanco, p. en la entrada del usuario a una búsqueda; pero si realmente desea ingresar información con espacios en blanco, será un problema (no puede tener un índice con 'a' y 'a').
Véase también
Los espacios en blanco finales en varchar necesitan a considerar en comparación
Posiblemente podrías revertir las cadenas en esa columna, e inviértalas cuando las muestre. Por supuesto, esto arruinará cualquier orden basado en esa columna, pero si solo prueba la igualdad o la existencia de subcadenas, podría funcionar. Liderar los espacios cuentan.
Para búsquedas de igualdad, también puede almacenar la codificación base64 de la cadena, que debe mantener el orden lexicográfico (es decir, el orden entre a y b debe mantenerse entre base64(a) y base64(b)). O puede agregar un terminador en la cadena ("\n" podría funcionar bien y no aparecer en las búsquedas).
Finalmente, pero es arriesgado porque los humanos no pueden notar la diferencia, podrías reemplazar los espacios con el carácter UTF8 (49824):
mysql> select concat ('\'a', char(49824),'\'') AS tricked,
concat ('\'a', ' ' ,'\'') as honest,
concat ('\'a', char(49824),'\'') =
concat ('\'a', ' ' ,'\'') as equals;
+---------+--------+--------+
| tricked | honest | equals |
+---------+--------+--------+
| 'a ' | 'a ' | 0 |
+---------+--------+--------+
1 row in set (0.00 sec)
Las filas parecen ser iguales, pero no lo son. Tenga en cuenta que en HTML el espacio es un espacio y 49824 es
(espacio irrompible). Esto afecta a las funciones que se convierten de un lado a otro de HTML, y el hecho de que nbsp sea en realidad un punto de código UTF8 significa que honesto la cadena es de dos bytes, pero la longitud de engañado la cadena es en realidad tres .
Finalmente puedes declarar la columna VARBINARY
en lugar de VARCHAR
, ocultando así por completo lo que está sucediendo. Parece la solución más fácil, pero me temo que podría molestarte algunas semanas o meses más adelante.