2010-10-13 4 views

Odpowiedz

1

apostrofów wokół liczby (to znaczy, '079674839'), jeśli jest to nigdzie w kodzie inline SQL. Ponadto, jeśli robisz to programowo, upewnij się, że nie przechodzisz przez konwersję numeryczną.

+0

Dodaję ciągi programowo. Czy istnieje sposób na zapisanie liczby zawierającej początkowe zera w SQLite? – ram

+0

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

7

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.

+0

Dziękuję bardzo, to powinna być zaakceptowana odpowiedź. Powinowactwo typu SQLite może prowadzić do kilku nieprzyjemnych, trudnych do wykrycia błędów. SQLite powinien zgłosić błąd dla nieprawidłowych typów ... możesz umieścić go w '' 'CREATE TABLE tableName (Col1 ScoobyDoobyDoo);' '', który będzie domyślnie liczbą całkowitą, ale nie będziesz miał pojęcia, dopóki nie zaczniesz zapytanie o coś takiego jak "00789" i wychodzi jako 789 ... –