2011-10-24 12 views
15

Estaba haciendo algunas pruebas, y fue una sorpresa cuando estaba consultando una tabla, y la consulta SELECT * FROM table WHERE email=0 devolvió todas las filas de la tabla.mySQL devuelve todas las filas cuando campo = 0

Esta tabla no tiene valores '0' y está llena de correos electrónicos regulares.

¿Por qué sucede esto? Esto puede conducir a serios problemas de seguridad.

¿Hay alguna forma de evitar esto sin modificar la consulta?

¿Me falta algo aquí?

Gracias.

Respuesta

21

Esto se debe a que está convirtiendo el campo de correo electrónico (que supongo que es un campo varchar) en un número entero. Cualquier campo sin un número entero válido equivaldrá a 0. Debe asegurarse de que solo compare los campos de cadena con los valores de cadena (lo mismo ocurre con las fechas, en comparación con las fechas). La consulta debe ser la siguiente.

SELECT * FROM table WHERE email='0'; 
+3

qué cree que MySQL debería estar trabajando de esta manera? Creo que este es el lugar donde es fácil introducir errores. No entiendo por qué tiene que hacer esto, como conversiones con sentido, como convertir cualquier cadena a 0. ¿Por qué no mejor convertir 0 a '0'? Tendría mucho más sentido –

6

Su columna email es un tipo CHAR o VARCHAR. Cuando utiliza la condición email = 0, MySQL está transfiriendo el contenido de la columna email a un número entero para compararlos con el 0 que ha proporcionado. Si hubiera rodeado su 0 entre comillas, la consulta funcionaría como se esperaba. (email = '0')

la conversión de una cadena no numérica en un entero en MySQL dará lugar a 0.

mysql> SELECT CAST('[email protected]' AS SIGNED); 
+-------------------------------------+ 
| CAST('[email protected]' AS SIGNED) | 
+-------------------------------------+ 
|         0 | 
+-------------------------------------+ 

Por el contrario, si intentó lo mismo con las series numéricas, se podrán emitir correctamente:

mysql> SELECT CAST('12345' AS SIGNED); 
+-------------------------+ 
| CAST('12345' AS SIGNED) | 
+-------------------------+ 
|     12345 | 
+-------------------------+ 
-1

si desea obtener todos los registros en los que la columna de correo electrónico no debe estar en blanco o vacío, entonces se puede utilizar

SELECT * FROM table WHERE email IS NOT NULL; 
3

El campo de correo electrónico es probablemente caracteres y está haciendo coincidir valores numéricos.

Pruebe con,

SELECT * FROM table WHERE email='0'; 
Cuestiones relacionadas