Si sqlite no tiene texto, ¿por qué declaramos el tipo de datos de la columna? ¿De qué sirve el tipo de datos de declaración?SQLite no tiene tipo?
Why android SQLite can store double value(java 8 bytes) into float column
Si sqlite no tiene texto, ¿por qué declaramos el tipo de datos de la columna? ¿De qué sirve el tipo de datos de declaración?SQLite no tiene tipo?
Why android SQLite can store double value(java 8 bytes) into float column
Se utiliza para determinar la "afinidad" de la columna.
CREATE TABLE Example (
IntegerAffinity INTEGER,
RealAffinitity REAL,
NumericAffinity NUMERIC,
TextAffinity TEXT,
NoAffinity
);
Inserción de algunos valores en esta tabla (con módulo de Python sqlite3
) 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')]
El tipo de datos declarado columna se utiliza como una pista (http://sqlite.org/faq.html#q3):
Así, por ejemplo, si una columna es de 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; usa tipado 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 la tabla. http://sqlite.org/datatype3.html
Revise la documentación. http://sqlite.org/datatype3.html
Con el fin de maximizar la compatibilidad entre SQLite y otros motores de bases de datos, SQLite apoya el concepto de "tipo de afinidad" en columnas. La afinidad de tipo de una columna es el tipo recomendado para los datos almacenados en esa columna. La idea importante aquí es que el tipo es recomendado, no requerido. Cualquier columna puede almacenar cualquier tipo de datos . Es solo 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 denomina "afinidad".
Parece que intentan mantener la compatibilidad con otros DBMS.
también quieren ser capaces de hacer lo siguiente:
... valores de coma flotante pequeños sin componente fraccional y se almacena en columnas con afinidad real son escritos en el disco como números enteros con el fin de ocupan menos espacio y se convierten automáticamente al punto flotante a medida que se lee el valor.
En última instancia, la afinidad de una columna está determinada por el tipo declarado de la columna, por lo que usted declara el tipo de la columna.
También [lo justifican como un error] (http://www.sqlite.org/datatypes.html), y luego básicamente admiten que están equivocados al agregar texto y tipos numéricos más tarde. – Timmmm