2012-07-02 16 views
9

parecer un tema muy raro, pero En mi opinión muy molesto y el mal: espacios en blanco en MySQL no se utilizan en la comparación:MySQL haciendo cuestión de espacio en blanco

mysql> SELECT "A" = "A "; 
+------------+ 
| "A" = "A " | 
+------------+ 
|   1 | 
+------------+ 
1 row in set (0.00 sec) 

Esto es especialmente problemático en el siguiente escenario:

mysql> SELECT COUNT(*) FROM eq WHERE name != TRIM(name); 
+------------+ 
| COUNT(*) | 
+------------+ 
|   0 | 
+------------+ 
1 row in set (0.00 sec) 

mysql> UPDATE eq SET name=TRIM(name); 
Query OK, 866 row affected (0.01 sec) 
Rows matched: 650907 Changed: 866 Warnings: 0 

¿Hay alguna forma de configurar MySQL para tratar el espacio en blanco correctamente?

+1

una comparación binaria evitará la eliminación de espacios finales: SELECT BINARIO 'a' = BINARIO 'a'; '' –

Respuesta

2

que utilices, como

SELECT "A" LIKE "A "; 

devolverá 0, pero

SELECT "A" LIKE "A"; 

devuelve 1

6

Según the manual, una solución rápida es utilizar como:

Según el estándar SQL, LIKE realiza ma Tching sobre una base por carácter, por lo que puede producir resultados diferentes del operador = comparación:

...

En particular, los espacios finales son significativos, lo cual no es cierto para CHAR o VARCHAR comparaciones realizadas con the = operator ...

siempre que no utilice ningún comodín, este debe ser idéntico al =. Esta pregunta desbordamiento de pila parece apoyar la hipótesis: Equals(=) vs. LIKE

El manual no indica si STRCMP() es más estricta que = en términos de espacios en blanco, y no puedo probarlo ahora mismo - que podría valer la pena echar un vistazo a, también, ya que lo hace más claro por qué= no se utiliza.

La comparación binaria sugerida por Tombom también es una opción, pero tendrá otros efectos secundarios (como la comparación más estricta de diéresis, por ejemplo, A y Ä serán diferentes) que puede o no desear. Más información sobre los efectos del uso de una comparación binaria en this question.

+1

STRCMP' parece actuar idéntica a '='. Mientras 'LIKE' también presta atención a la capitalización. ¡Gracias! – Mikhail

+0

@Mikhail ahh, ¿entonces ninguno de los dos funciona para ti? Eso apesta. Entonces supongo que la comparación binaria es la única manera de ir a –

2

La comparación binaria es la palabra mágica.

Binary Comparison in MySQL Manual

mysql> SELECT 'a' = 'A'; 
     -> 1 
mysql> SELECT BINARY 'a' = 'A'; 
     -> 0 
mysql> SELECT 'a' = 'a '; 
     -> 1 
mysql> SELECT BINARY 'a' = 'a '; 
     -> 0 
+0

+1, pero tenga en cuenta que esto también puede cambiar otros comportamientos (como la comparación de Umlauts) –

Cuestiones relacionadas