Podwójnie sprawdź schemat bazy danych. Jak udokumentowano na Datatypes in SQLite Version 3, nazwa typu kolumny ma wpływ na sposób przetwarzania wartości przed ich zapisaniem.
Oto program Python wykazać, wykorzystując bazę danych w pamięci:
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])
Wyjście jest:
i r t b
796 796.0 u'0796' u'0796'
Tak, to wygląda jak kolumna jest faktycznie typu całkowitą. Spójrz na definicję schematu (sqlite3 database.db .schema
działa z wiersza poleceń), spójrz na numer documentation i upewnij się, że używasz jednej z nazw typów odwzorowujących powinowactwo TEXT. Nieznane nazwy typów otrzymują powinowactwo INTEGER.
W moim własnym przypadku użyłem "STR", który kończy się domyślnym powinowactwem INTEGER. Zmieniłem go na "TEKST", a SQLite zaczęło szanować moje początkowe zera.
Dodaję ciągi programowo. Czy istnieje sposób na zapisanie liczby zawierającej początkowe zera w SQLite? – ram
W końcu włamałem się do problemu, dodając token do numeru przed wstawieniem numeru do bazy danych i usunięcie tokena po pobraniu numeru z bazy danych. Wymaga to jednak manipulacji String, która jest bardzo powolna. – ram