2012-08-13 12 views
16

Tengo una base de datos SQLite con mi aplicación Android. Me he dado cuenta de que accidentalmente definí una tabla usando un tipo de datos "Cadena" en lugar de un tipo de datos "Texto". Aquí está el código con la secuencia:Diferencia entre el tipo de datos "Texto" y "Cadena" en 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);"; 

Esto funciona. Nunca ha arrojado un error y puedo almacenar y recuperar datos. Sin embargo, no puedo encontrar ninguna referencia a un tipo de datos "String" en SQLite en la documentación o en Internet. Por lo general, todos los datos de tipo cadena se define con "texto" de este 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);"; 

Así que mi pregunta es, ¿cuál es la diferencia entre un campo definido con un tipo de datos "string" frente a un tipo de datos "texto"? ¿Hay una diferencia? Si es así, ¿cuáles son las consecuencias, si las hay, del uso de una u otra?

Respuesta

26

Lo sutil a tener en cuenta aquí es que SQLite no impone el tipo de datos de valores que coloca en columnas. Eso significa que puede poner texto en un campo numérico, y así sucesivamente.

Para comprender la diferencia entre sus dos declaraciones SQL, consulte la sección 2.1 Determination Of Column Affinity, que mapea los tipos de columna que proporciona a las clases de almacenamiento que SQLite usa.

En este caso, el tipo string se asigna la clase de almacenamiento NUMERIC a través de la regla 5. Declarar el campo como en el código text diría a los DBMS a utilizar la clase TEXT almacenamiento. Nuevamente, dado que SQLite no impone los tipos de columnas, su código probablemente funcionará bien cuando almacene Cadenas como una columna NUMERIC, como usted nota.

Como un ejemplo alternativo, se podría definir una columna con el tipo INTERESTING STUFF, y que sería asignada a la clase INTEGER de almacenamiento, a través de la regla 1.

En general, es probablemente una buena idea utilizar sólo text para su tabla de definición.

+2

Gracias por la respuesta. Una vez que encontré el error, hice el cambio, pero desafortunadamente tengo un código en producción con este error. Dado que no parece ser un problema importante, voy a dejar que envejezcan naturalmente. Esta es realmente una gran información. ¡Gracias! –

4

Esta es una pregunta antigua, pero quiero resaltar una diferencia específica entre los tipos de columnas STRING y TEXT. Si una cadena se ve como un valor numérico, STRING la convertirá en un valor numérico, mientras que TEXT no realizará ninguna conversión.

p. Ej. será despojado

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

Esto significa ceros a la izquierda, los ceros finales puntos decimales, y además de símbolo en los valores "numéricos":

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 

filas de salida voluntad con valores. Esto causará problemas si tiene la intención de hacer una coincidencia de cadena utilizando los valores leídos de la tabla.

Cuestiones relacionadas