[pyar] MySQLdb - Error con query

Angel Freire cuerty en gmail.com
Mar Feb 8 11:24:57 ART 2011


2011/2/8 Alberto Leonhell Silveira Gazzano <leonhell en gmail.com>:
> Ok, gracias pero no me muestra warnings, de todas formas convengamos que no
> debería mostrar resultados igual.
>
> Saludos
>
> El 8 de febrero de 2011 11:07, Angel Freire <cuerty en gmail.com> escribió:
>>
>> 2011/2/8 Alberto Leonhell Silveira Gazzano <leonhell en gmail.com>:
>> > Perdón, pero ahora que presto atención cuando ejecuto la misma consulta
>> > en
>> > MYSQL también devuelve resultados:
>> >
>> > mysql> SELECT * FROM usuarios where nrodoc = '1234sdfgfs'
>> >
>> > Con lo cual el "problema" no sería en python...
>> >
>> > alguna sugerencia?
>> >
>> > El 8 de febrero de 2011 10:46, Facundo Batista
>> > <facundobatista en gmail.com>
>> > escribió:
>> >>
>> >> 2011/2/8 Alberto Leonhell Silveira Gazzano <leonhell en gmail.com>:
>> >>
>> >> > Estimados, tengo un error bastante raro al consultar un DNI en una
>> >> > tabla
>> >> > de
>> >> > usuarios. Cuando ejecuto un query con c.execute("select nrodoc from
>> >> > solicitante where nrodoc=%s", DNI) si tengo un nrodoc "1234" (por
>> >> > ejemplo) y
>> >> > consulto por el número de DNI "12345djfhsjadfh" (es decir 1234 más
>> >> > letras)
>> >> > la consulta me devuelve los registros correspondientes al DNI "1234"
>> >> > (!!!??). Probé haciéndolo directamente sobre MySQL y no devuelve
>> >> > resultados,
>> >> > pero al hacerlo desde el módulo python sí.
>> >> > El campo en la tabla es del tipo BIGINT y me ocurre esto no sólo con
>> >> > el
>> >> > DNI
>> >> > sino con todos los campos de este tipo.
>> >>
>> >> Si el campo es BIGINT, ¿cómo es que le pasás algo con *letras* en la
>> >> búsqueda?
>> >>
>> >> Quizás te está mordiendo alguna conversión automágica de typos.
>> >>
>> >> Si teniendo 1234 le pasás 12345 (no "12345"), ¿qué pasa?
>> >>
>> >> Slds.
>> >>
>> >> --
>> >> .    Facundo
>> >>
>> >> Blog: http://www.taniquetil.com.ar/plog/
>> >> PyAr: http://www.python.org/ar/
>> >> _______________________________________________
>> >> pyar mailing list pyar en python.org.ar
>> >> http://listas.python.org.ar/listinfo/pyar
>> >>
>> >> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>> >
>> >
>> > _______________________________________________
>> > pyar mailing list pyar en python.org.ar
>> > http://listas.python.org.ar/listinfo/pyar
>> >
>> > PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>> >
>>
>> El problema es que MySQL hace una conversión implícita del tipo de
>> datos que le pasas (un varchar) a un numero (unsigned) para poder
>> compararlo con un bigint:
>>
>> mysql> SELECT CAST('123asd' AS UNSIGNED);
>> +----------------------------+
>> | CAST('123asd' AS UNSIGNED) |
>> +----------------------------+
>> |                        123 |
>> +----------------------------+
>> 1 row in set, 1 warning (0.20 sec)
>>
>> Fijate que seguramente debes tener un warning después de ejecutar una
>> query así, lo podes ver así:
>>
>> mysql> SHOW WARNINGS;
>> +---------+------+---------------------------------------------+
>> | Level   | Code | Message                                     |
>> +---------+------+---------------------------------------------+
>> | Warning | 1292 | Truncated incorrect INTEGER value: '123asd' |
>> +---------+------+---------------------------------------------+
>> 1 row in set (0.20 sec)
>>
>> Si lo que queres es que dado '123abc' no lo convierta a un numero para
>> compararlo con un BIGINT podes convertir el campo de la tabla (el
>> bigint) a un string usando CAST [0] pero ahí desaprovecharías
>> cualquier indice que tuvieras sobre esa columna y de hecho harías un
>> full table scan para encontrar todos los igualan esa condición. Te
>> recomiendo ver el resultado de EXPLAIN [1] antes de poner una query
>> así en producción.
>>
>> Saludos,
>> Angel
>>
>> [0] http://dev.mysql.com/doc/refman/5.1/en/cast-functions.html
>> [1] http://dev.mysql.com/doc/refman/5.1/en/explain.html
>>
>> --
>> http://blog.cuerty.com
>>
>> "If you want to set off and go develop some grand new thing, you don't
>> need millions of dollars of capitalization. You need enough pizza and
>> Diet Coke to stick in your refrigerator, a cheap PC to work on and the
>> dedication to go through with it."
>> - John Carmack
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>

Los warnings los podes ver solamente ejecutando la query en un query
analizer y después de haberla ejecutado correr "SHOW WARNINGS", el
modulo de Python no te devuelve los warnings.

En cuanto a que no debería mostrar nada es cuestión de gustos u
opinión, pero la documentación [0] dice exactamente lo contrario:

"When an operator is used with operands of different types, type
conversion occurs to make the operands compatible. Some conversions
occur implicitly. For example, MySQL automatically converts numbers to
strings as necessary, and vice versa."

Saludos,
Angel

[0] http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

-- 
http://blog.cuerty.com

"If you want to set off and go develop some grand new thing, you don't
need millions of dollars of capitalization. You need enough pizza and
Diet Coke to stick in your refrigerator, a cheap PC to work on and the
dedication to go through with it."
- John Carmack



More information about the pyar mailing list