Vuelva a verificar el esquema de la base de datos. Como se documenta en Datatypes in SQLite Version 3, el nombre del tipo de columna afecta cómo se procesan los valores antes de almacenarse.
He aquí un programa Python para demostrar, utilizando una base de datos en memoria:
import sqlite3
db = sqlite3.connect(':memory:')
val = "0796";
db.execute('CREATE TABLE test (i INTEGER, r REAL, t TEXT, b BLOB);')
db.execute('INSERT INTO test VALUES (?, ?, ?, ?);', (val, val, val, val))
res = db.execute('SELECT * FROM test');
print '\t'.join([x[0] for x in res.description])
for row in res.fetchall():
print '\t'.join([repr(x) for x in row])
La salida es:
i r t b
796 796.0 u'0796' u'0796'
Por lo tanto, parece que la columna es en realidad un tipo entero. Eche un vistazo a la definición de esquema (sqlite3 database.db .schema
funciona desde la línea de comandos), mire documentation nuevamente y asegúrese de estar utilizando uno de los nombres de tipo que se correlacionan con la afinidad TEXTO. Los nombres de tipos desconocidos obtienen INTEGER afinidad.
En mi caso, estaba usando 'STR', que termina con la afinidad INTEGER predeterminada. Lo cambié a 'TEXTO', y SQLite comenzó a respetar mis ceros iniciales.
Estoy agregando cadenas de manera programática. Entonces, ¿hay alguna forma de almacenar un número que incluya los ceros a la izquierda en SQLite? – ram
Finalmente corté el problema agregando un token al número antes de insertar el número en el DB, y eliminar el token después de recuperar el número del DB. Sin embargo, requiere la manipulación de cadenas, que es muy lenta. – ram