2012-08-13 31 views
16

Ich habe eine SQLite-Datenbank mit meiner Android-Anwendung. Ich habe bemerkt, dass ich versehentlich eine Tabelle mit einem "String" -Datentyp anstelle des "Text" -Datentyps definiert habe. Hier ist der Code mit der Zeichenfolge:Unterschied zwischen "Text" und "String" -Datentyp in 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);"; 

Dies funktioniert. Es hat nie einen Fehler geworfen und ich kann Daten speichern und abrufen. Allerdings kann ich keinen Verweis auf einen "String" -Datentyp in SQLite in der Dokumentation oder im Internet finden. Typischerweise werden alle String-Typ-Daten mit „Text“ wie so definiert:

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

Also meine Frage ist, was ist der Unterschied zwischen einem Feld mit einem „string“ Datentyp im Vergleich zu einem „Text“ Datentyp definiert ist? Ist da ein Unterschied? Wenn ja, welche Konsequenzen hat es, wenn man das eine oder das andere benutzt?

Antwort

26

Das Subtile, was hier zu beachten ist, ist, dass SQLite den Datentyp von Werten, die Sie in Spalten eingeben, nicht erzwingt. Das bedeutet, dass Sie Text in ein numerisches Feld einfügen können, und so weiter.

Um den Unterschied zwischen Ihren beiden SQL-Anweisungen zu verstehen, lesen Sie den Abschnitt 2.1 Determination Of Column Affinity, der die von Ihnen bereitgestellten Spaltentypen den von SQLite verwendeten Speicherklassen zuordnet.

In diesem Fall wird die Art stringNUMERIC über Regel-Speicherklasse zugeordnet 5. das Feld als text in Code Deklarieren dem DBMS die TEXT Speicherklasse zu verwenden, würde sagen. Da SQLite die Spaltentypen nicht erzwingt, wird Ihr Code wahrscheinlich gut ausgeführt, wenn Sie Strings als NUMERIC-Spalte speichern, wie Sie bemerken.

Als alternatives Beispiel könnten Sie eine Spalte mit Typ INTERESTING STUFF definieren und das würde auf die INTEGER Speicherklasse zugeordnet werden, über Regel 1.

Insgesamt ist es wahrscheinlich eine gute Idee, nur text verwenden für Ihre Tabellendefinition

+2

Vielen Dank für die Antwort. Sobald ich den Fehler gefunden habe, habe ich die Änderung vorgenommen, aber ich habe leider Code mit diesem Fehler in der Produktion. Da es kein großes Problem zu sein scheint, lasse ich sie natürlich altern. Das sind wirklich großartige Informationen. Vielen Dank! –

4

Dies ist eine alte Frage, aber ich möchte einen bestimmten Unterschied zwischen einem STRING- und TEXT-Spaltentypen hervorheben. Wenn eine Zeichenfolge wie ein numerischer Wert aussieht, konvertiert STRING sie in einen numerischen Wert, während TEXT keine Konvertierung durchführt.

z.B.

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 

Willen Ausgabereihen mit Werten:

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

Dies bedeutet Nullen führende Nullen Dezimalpunkte nachlauf und Plus-Symbol auf den „numerischen“ Werte gestrippt werden. Dies führt zu Problemen, wenn Sie eine Zeichenfolgenübereinstimmung mit den aus der Tabelle ausgelesenen Werten durchführen möchten.

Verwandte Themen