2010-10-13 10 views

Respuesta

1

utilizar comillas simples alrededor del número, (es decir, '079674839') si se trata de cualquier parte de código en línea de SQL. Además, si está haciendo esto programáticamente, asegúrese de que no está pasando por una conversión numérica.

+0

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

+0

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

7

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.

+0

Muchas gracias, esta debería ser la respuesta aceptada. La afinidad de tipo de SQLite puede llevar a algunos desagradables errores difíciles de rastrear. SQLite debería arrojar un error para los tipos no válidos ... puedes ponerlo en '' 'CREATE TABLE tableName (Col1 ScoobyDoobyDoo);' '' y eso se convertirá en un entero, pero no tendrás idea hasta que comiences preguntando algo como '00789' y sale como 789 ... –

Cuestiones relacionadas