systemadmin.es > DBA > El curioso caso de los int comparados con strings en MySQL

El curioso caso de los int comparados con strings en MySQL

El MySQL a veces tiene comportamientos sorprendentes o acabas descubriendo porque stopped no es lo mismo que not running. Por ejemplo, comparando una cadena con un int puedes obtener resultados.

Vamos a suponer la siguiente tabla de ejemplo con datos:

mysql> create table test(id int, txt text);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test values(1,"uno");
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values(2,"dos");
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values(3,"tres");
Query OK, 1 row affected (0.00 sec)

Cualquier podría suponer que si comparamos el id con un string no obtendremos ningún resultado:

mysql> select * from test where id="asfsafsa";
Empty set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'asfsafsa' |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)

mysql> 

Lo curioso es el Truncated, si añadimos un número al inicio obtenemos resultados:

mysql> select * from test where id="1asfsafsa";
+------+------+
| id   | txt  |
+------+------+
|    1 | uno  |
+------+------+
1 row in set, 1 warning (0.00 sec)

Evidentemente, con el mismo WARNING:

mysql> show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '1asfsafsa' |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)

No me parece el comportamiento adecuado, si comparamos un string con un número, si el string no es un número no debería mostrar en ningún caso ningún resultado.

One comment to “El curioso caso de los int comparados con strings en MySQL”

  1. La conversión de tipos, redondeo, truncamiento, etc siempre son polémicos de cara al desarrollador final. Lo más correcto parece ser validar datos en la entrada o comparaciones y asegurarse de que siempre se están comparando los mismos tipos de datos. Los test unitarios en estos casos suelen ser muy útiles y evitan comportamientos anómalos.

    Por otro lado, tuve un comportamiento similar con el redondeo de floats a int en PyGObject, que según sus desarrolladores es considerado como característica (hasta cierto punto, quizás no en todos los casos). Dejo el link del bug como referencia: https://bugzilla.gnome.org/show_bug.cgi?id=684314

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>