2012-05-08 18 views
8

Si la fila de la base de datos es así: country = 'usa' y consulto "select * from data where country = 'usa '" también devuelve esta fila. Entonces no es una coincidencia exacta.Operador de comparación MySQL, espacios

¿Por qué MySQL hace esto? ¿Y en qué otros casos también volverá VERDADERO cuando no es verdad?

Respuesta

4

Los espacios al final se omiten si la columna es del tipo char o varchar; utilizando like 'usa ' resuelve el problema

+0

+1, http://dev.mysql.com/doc/refman/5.0/en/char.html, cuando se recuperan los valores CHAR, los espacios finales se eliminan. –

0

intentarlo con like o con este

country = 'usa ' AND LENGTH(country) = LENGTH('usa ') 
9

Como se mencionó en the manual:

Todas las intercalaciones de MySQL son de tipo PADSPACE. Esto significa que todos los valores CHAR y VARCHAR en MySQL se comparan sin tener en cuenta ningún espacio final.

En la definición del operador de LIKE, se indica:

En particular, los espacios finales son significativos, lo que no es cierto para CHAR o VARCHAR comparaciones realizadas con el operador =:

Como se menciona en this answer:

Este comportamiento se especifica en SQL-92 y SQL: 2008. Para fines de comparación, la cuerda más corta está acolchada a la longitud de la cadena más larga.

Desde el proyecto (8,2 < comparación predicado >):

Si la longitud en caracteres de X no es igual a la longitud en caracteres de Y, a continuación, la cadena más corta se sustituye eficazmente, a los efectos de comparación, con una copia de sí mismo 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 pad, donde el carácter del pad se elige en función de CS. Si CS tiene la característica NO PAD, entonces el carácter pad es un carácter dependiente de la implementación, diferente de cualquier carácter en el conjunto de caracteres de X e Y que recopila menos que cualquier cadena bajo CS. De lo contrario, el carácter del panel es un espacio < >.

Además de las otras soluciones excelentes:

select binary 'a' = 'a ' 
+0

Muy buena respuesta –

+0

@eggyal, ¿cuál es la ** solución **? – Pacerier

0

El manual dice esto:

Todas las intercalaciones de MySQL son del tipo PADSPACE. Esto significa que todos los valores de CHAR y VARCHAR en MySQL se comparan sin tener en cuenta los espacios finales Esto es cierto para todas las versiones de MySQL y no se ve afectado por el modo SQL del servidor.

http://dev.mysql.com/doc/refman/5.5/en/char.html

Si tiene que considerar el espacio en blanco, que básicamente tienen que deshacerse de la clasificación en cuenta el idioma. Una forma simple es forzar una intercalación binaria. Por favor, ejecute y compara:

SELECT 'ab'='ab ', BINARY 'ab'='ab ' 
+0

Observación súper pedante: el operador 'BINARY' aquí no está" forzando una intercalación binaria ", lo que se lograría aplicando una cláusula' COLLATE * _bin', sino que está convirtiendo su operando no binario en una cadena binaria: el efecto de lo que ocurre es que la comparación es exactamente byte por byte, que es similar a lo que haría una intercalación binaria (excepto que las intercalaciones binarias todavía son PADSPACE). Los lectores pueden encontrar útil conocer esta diferencia, explicada con más detalle en la sección del manual [Las colaciones bin y binario] (https://dev.mysql.com/doc/es/charset-binary-collations.html) . – eggyal

+0

Gracias, estas aclaraciones nunca están fuera de lugar. Ni siquiera descartaría que realmente tuviera en mente la "comparación binaria", pero lo escribí mal, lo hago con bastante frecuencia :) –

Cuestiones relacionadas