[pyar] MySQLdb - Error con query

Angel Freire cuerty en gmail.com
Mar Feb 8 11:07:52 ART 2011


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



More information about the pyar mailing list