2012-08-13 8 views
16

Ho un database SQLite con la mia applicazione Android. Ho notato che ho definito accidentalmente una tabella usando un tipo di dati "String" invece del tipo di dati "Testo". Ecco il codice con stringa:Differenza tra il tipo di dati "Testo" e "String" 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);"; 

Questo funziona. Non ha mai generato un errore e posso memorizzare e recuperare i dati. Tuttavia non riesco a trovare alcun riferimento a un tipo di dati "String" in SQLite nella documentazione o su Internet. In genere, tutti i dati di tipo stringa viene definito con "testo" in questo modo:

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

Quindi la mia domanda è, qual è la differenza tra un campo definito con un tipo di dati "stringa" rispetto a un tipo di dati "testo"? C'è una differenza? In tal caso, quali sono le conseguenze, se ce ne sono, dell'utilizzo dell'uno o dell'altro?

risposta

26

La cosa più importante da notare qui è che SQLite non applica il tipo di dati dei valori inseriti nelle colonne. Ciò significa che puoi inserire il testo in un campo numerico e così via.

Per comprendere la differenza tra le due istruzioni SQL, consultare la sezione 2.1 Determination Of Column Affinity, che associa i tipi di colonna forniti alle classi di memoria utilizzate da SQLite.

In questo caso, il tipo di string viene mappato su classe di memorizzazione NUMERIC tramite regola 5. Dichiarare il campo come text nel codice avrebbe detto al DBMS di utilizzare la classe TEXT stoccaggio. Di nuovo, dal momento che SQLite non impone i tipi di colonne, il vostro codice funzionerà probabilmente correttamente quando si memorizzano le stringhe come colonna NUMERIC, come si nota.

Come esempio alternativa, è possibile definire una colonna con tipo INTERESTING STUFF, e che sarebbe stato mappato alla classe INTEGER stoccaggio, tramite regola 1.

In generale, è probabilmente una buona idea quella di utilizzare solo text per la vostra definizione della tabella.

+2

Grazie per la risposta. Una volta trovato l'errore, ho apportato la modifica ma sfortunatamente ho il codice in produzione con questo errore. Dal momento che non sembra essere un grosso problema, lascerò che invecchino naturalmente. Questa è davvero una grande informazione. Grazie! –

4

Questa è una domanda precedente, ma desidero evidenziare una differenza specifica tra i tipi di colonna STRING e TEXT. Se una stringa assomiglia a un valore numerico, STRING la convertirà in un valore numerico, mentre TEXT non eseguirà alcuna conversione.

ad es.

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 

righe di output volontà con valori:

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

Ciò significa zeri iniziali, zero finali decimali, e più simbolo sui valori numerici "" sarà spogliato. Ciò causerà problemi se si intende eseguire una corrispondenza di stringa utilizzando i valori letti dalla tabella.

Problemi correlati