2012-08-13 10 views
16

Mam bazę danych SQLite z moją aplikacją na Androida. Zauważyłem, że przypadkowo zdefiniowałem tabelę używając typu danych "String" zamiast typu danych "Text". Oto kod z ciągiem:Różnica między typem danych "Tekst" i "Ciągiem" w SQLite

private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName string not null, UpdateDate string not null);"; 

To działa. Nigdy nie wyrzucił błędu i mogę przechowywać i pobierać dane. Jednak nie mogę znaleźć żadnego odniesienia do typu danych "String" w SQLite w dokumentacji lub w Internecie. Typowo, wszystkie dane typu ciąg jest zdefiniowany „tekst” tak:

private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName text not null, UpdateDate text not null);"; 

Więc moje pytanie brzmi, jaka jest różnica między polem zdefiniowanym w „string” typ danych kontra „tekst” typu danych? Czy istnieje różnica? Jeśli tak, jakie są ewentualne konsekwencje korzystania z jednego lub drugiego?

Odpowiedz

26

Należy zauważyć, że SQLite nie wymusza typ danych wartości umieszczonych w kolumnach. Oznacza to, że możesz umieścić tekst w polu liczbowym i tak dalej.

Aby zrozumieć różnicę między dwoma instrukcjami SQL, należy zapoznać się z sekcją 2.1 Determination Of Column Affinity, która odwzorowuje typy kolumn podawane w klasach pamięci SQLite.

W tym przypadku typ string zostanie odwzorowane na klasę pamięci NUMERIC poprzez reguły 5. deklarowania boiska text w kodzie by powiedzieć DBMS użyć klasy TEXT przechowywania. Ponownie, ponieważ SQLite nie wymusza typów kolumn, Twój kod będzie prawdopodobnie działał poprawnie podczas przechowywania Strings jako kolumny NUMERIC, jak zauważyłeś.

Jako alternatywny przykład można zdefiniować kolumnę typu INTERESTING STUFF, i że być przypisane do klasy INTEGER pamięci, poprzez reguły 1.

Ogólnie rzecz biorąc, to chyba dobry pomysł, aby po prostu użyć text dla Twojego definicja tabeli.

+2

Dziękuję za odpowiedź. Gdy znalazłem błąd, wprowadziłem zmianę, ale niestety mam kod w produkcji z tym błędem. Ponieważ nie wydaje się to poważnym problemem, po prostu pozwolę im zestarzeć się w sposób naturalny. To naprawdę świetna informacja. Dziękuję Ci! –

4

To jest stare pytanie, ale chcę podkreślić konkretną różnicę między typami kolumn STRING i TEXT. Jeśli ciąg ma wartość liczbową, STRING przekształci go w wartość liczbową, a TEKST nie wykona żadnej konwersji.

np.

create table t1(myint INTEGER, mystring STRING, mytext TEXT); 
insert into t1 values ('0110', '0220', '0330'); 
insert into t1 values ('-0110', '-0220', '-0330'); 
insert into t1 values ('+0110', '+0220', '+0330'); 
insert into t1 values ('x0110', 'x0220', 'x0330'); 
insert into t1 values ('011.0', '022.0', '033.0'); 
select * from t1 

wyjściowych wierszy będzie o wartościach:

myint mystring mytext 
    110  220 0330 
    -110  -220 -0330 
    110  220 +0330 
x0110 x0220 x0330 
    11  22 033.0 

oznacza to, co prowadzi zer zer miejsca po przecinku, a znak plus na „” wartości liczbowe zostaną usunięte. Spowoduje to problemy, jeśli zamierzasz dopasować ciąg znaków, używając wartości odczytanych z tabeli.

Powiązane problemy