Martes 18 de marzo del 2008 -
Bases de datos,
Miscelánea,
MySQL
Test 5
Este Test es cortesia de Lasse Christiansen, aparentemente residente de Japón.
Imaginemos los siguientes comandos:
MySQL:CREATE TABLE test (
id VARCHAR(1) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO test VALUES ('0'), ('1'), ('2'), ('a'), ('b');
Los INSERT funcionan como deben y el resultado es que ahora tenemos los registros ‘0′, ‘1′, ‘2′, ‘a’ y ‘b’.
Ahora hacemos:
MySQL:DELETE FROM test WHERE id=0;
Y se borran tres registros... ¿ Por qué ?
Pulsa para Mostrar/Ocultar la solución
Respuesta: Este comportamiento es intencionado. Debemos fijarnos que el 0 de la sentencia DELETE no está entrecomillado, y cuando comparamos valores de diferentes tipos (en este caso caracteres de texto y un entero), MySQL intenta complacernos convirtiendolos primero a FLOAT* y luego haciendo la comparación de la sentencia WHERE . En el ejemplo mostrador, las cadenas ‘0′, ‘a’ y ‘b’, asi como el entero 0 con el que comparamos, se convierten en 0.0 al hacer la comparación como FLOAT — y por tanto son iguales y entran en la condición de borrado.
*Esto es simplificar las cosas un poco demasiado, en otros casos podriamos encontrar valores NULL y/o de tipo temporal en medio de nuestra consulta. Más información aqui.
Traducido con permiso expreso de Mysql Test Quiz 5 Original
Creado por Carsten H. Pedersen
Otros Test anteriores:
Fecha de la entrada: Martes, 18 de marzo del 2008 a las 1:56 pm. Puedes seguir los comentarios a la entrada utilizando su feed RSS 2.0. Si lo deseas, puedes dejarnos un comentario, o hacer trackback desde tu propio sitio web.
el # Martes, 25 de marzo del 2008 a las 00:52
[...] Spanish translation by Marcos Besteiro [...]
el # Martes, 25 de marzo del 2008 a las 11:55
[...] En el Test 5, trabajamos con los siguientes CREATE TABLE e INSERT: VER TEXTO PLANO MySQL: [...]