SQLite es sin tipo?

Si sqlite es sin tipo, ¿por qué declaramos el tipo de datos de la columna? ¿Cuál es el uso de declarar el tipo de datos?

¿Por qué Androidite SQLite puede almacenar doble valor (java 8 bytes) en la columna de flotación

3 Solutions collect form web for “SQLite es sin tipo?”

Se utiliza para determinar la "afinidad" de la columna.

CREATE TABLE Example ( IntegerAffinity INTEGER, RealAffinitity REAL, NumericAffinity NUMERIC, TextAffinity TEXT, NoAffinity ); 

Insertar algunos valores en esta tabla (con sqlite3 módulo sqlite3 de Python) da):

 >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [1234] * 5) >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['1234'] * 5) >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [math.pi] * 5) >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [str(math.pi)] * 5) >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['ABC'] * 5) >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'5678'] * 5) >>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'\xAB\xCD\xEF'] * 5) >>> list(db.execute("SELECT * FROM Example")) [(1234, 1234.0, 1234, '1234', 1234), (1234, 1234.0, 1234, '1234', '1234'), (3.141592653589793, 3.141592653589793, 3.141592653589793, '3.14159265358979', 3.141592653589793), (3.141592653589793, 3.141592653589793, 3.141592653589793, '3.141592653589793', '3.141592653589793'), ('ABC', 'ABC', 'ABC', 'ABC', 'ABC'), (b'5678', b'5678', b'5678', b'5678', b'5678'), (b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef')] 
  • En columnas de afinidad de texto, los números se convierten en cadenas.
  • En columnas de afinidad entera, real y numérica, las cadenas que contienen números se convierten en números.
  • Las cadenas que no contienen números siguen siendo cadenas, incluso en columnas numéricas.
  • Las burbujas siguen siendo blobs, independientemente de la afinidad de la columna.
  • En columnas con NINGUNA afinidad, los valores se insertan tal cual.

El tipo de datos de columna declarada se utiliza como una pista (http://sqlite.org/faq.html#q3):

Por ejemplo, si una columna es del tipo INTEGER e intenta insertar una cadena en esa columna, SQLite intentará convertir la cadena en un entero. Si puede, inserta el entero en su lugar. Si no, inserta la cadena. Esta característica se llama afinidad de tipo.

Por cierto, SQLite no es sin tipo; Utiliza el tipo dinámico. Esto significa que cualquier valor que inserte mantiene su propia información de tipo, en lugar de inferir el tipo de la declaración de tabla. http://sqlite.org/datatype3.html

Echa un vistazo a la documentación. http://sqlite.org/datatype3.html

Con el fin de maximizar la compatibilidad entre SQLite y otros motores de base de datos, SQLite soporta el concepto de "afinidad de tipo" en las columnas. El tipo de afinidad de una columna es el tipo recomendado para los datos almacenados en esa columna. La idea importante aquí es que el tipo se recomienda, no es necesario . Cualquier columna todavía puede almacenar cualquier tipo de datos. Es sólo que algunas columnas, dada la opción, preferirán usar una clase de almacenamiento sobre otra. La clase de almacenamiento preferida para una columna se llama su "afinidad".

Parece que están tratando de mantener la compatibilidad con otros DBMS.

También quieren ser capaces de hacer lo siguiente:

… pequeños valores de punto flotante sin componente fraccionario y almacenados en columnas con afinidad REAL se escriben en disco como números enteros para ocupar menos espacio y se convierten automáticamente de nuevo en punto flotante a medida que se lee el valor.

En última instancia, la afinidad de una columna se determina por el tipo declarado de la columna, por lo que se declara el tipo de la columna.

  • Examinar la base de datos SQLite de mi aplicación para Android?
  • ¿Necesito llamar a getWritableDatabase () cada vez que manipulo datos
  • ¿Cómo insertar datos en la base de datos SQLite en android?
  • ActiveAndroid Excepción SQLite 'No such table'
  • Android - Base de datos con ContentValue con error booleano?
  • Manejo de bases de datos con 2 procesos
  • Cómo utilizar DefaultDatabaseErrorHandler para controlar la corrupción de base de datos en Android
  • ¿Cómo obtengo el mejor rendimiento con SQLite en Android?
  • Capacidad máxima de almacenamiento de la base de datos SQLite
  • Un comportamiento extraño para reguelr sqlite operación en android
  • Limitaciones de SQLITE en Android - 25 tablas con 15 columnas cada una y 10k filas por tabla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.