2012-03-21 23 views

Respuesta

2

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')] 
  • En las columnas de texto afinidad, los números se convierten en cadenas.
  • En columnas de entero, real y de afinidad 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.
  • Los blobs permanecen blobs, independientemente de la afinidad de la columna.
  • En columnas con afinidad NONE, los valores se insertan tal como están.
3

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

1

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.

+0

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

Cuestiones relacionadas