Al crear una tabla en SQLite3, me confundo cuando me enfrento a todos los tipos de datos posibles que implican contenidos similares, entonces, ¿alguien podría decirme la diferencia entre los siguientes tipos de datos?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
¿Hay alguna documentación en alguna parte que enumere los valores min./max. capacidades de los diversos tipos de datos? Por ejemplo, supongo que smallint
tiene un valor máximo mayor que tinyint
, pero un valor menor que el entero, pero no tengo idea de cuáles son estas capacidades.
DATE
oBOOLEAN
, pero no me molestaría en distinguir entre diferentes tamaños de números enteros. Esto es especialmente cierto para el caso deINTEGER PRIMARY KEY
, el único caso en el que importa el nombre exacto del tipo.La diferencia es el azúcar sintáctico. Solo unas pocas subcadenas de los nombres de tipo importan en lo que respecta a la afinidad de tipos.
Las reglas para determinar la afinidad se enumeran en el sitio de SQLite .
Si insiste en una escritura estricta, puede implementarla con
CHECK
restricciones:Pero nunca me preocupo por eso.
En cuanto a la capacidad de cada tipo:
INTEGER
siempre tiene signo de 64 bits. Tenga en cuenta que SQLite optimiza el almacenamiento de pequeños enteros detrás de escena, por lo que TINYINT no sería útil de todos modos.REAL
es siempre de 64 bits (double
).TEXT
yBLOB
tener un tamaño máximo determinado por una macro de preprocesador, cuyo valor predeterminado es 1.000.000.000 bytes.fuente
TYPEOF
. Por lo tanto, los intentos de insertar un TEXTO que de otro modo se convertiría a la clase de almacenamiento NUMERIC / INTEGER por SQlite (es decir, tal conversión no tiene pérdidas según sqlite.org/datatype3.html#affinity ) fallarían. En otras palabras, este enfoque es más estricto que el enfoque ad-hoc de insertar el valor y luego de alguna manera validar mágicamente la clase de almacenamiento utilizada para almacenar ese valor por SQLite. Para un enfoque más permisivo, vea mi respuesta a continuación.La mayoría de ellos están ahí por compatibilidad. Realmente solo tienes integer, float, text y blob. Las fechas se pueden almacenar como un número (el tiempo de Unix es un número entero, el tiempo de Microsoft es flotante) o como texto.
fuente
NULL
. El valor es un valor NULO.INTEGER
. El valor es un entero con signo, almacenado en 1, 2, 3, 4, 6 u 8 bytes dependiendo de la magnitud del valor.REAL
. El valor es un valor de coma flotante, almacenado como un número de coma flotante IEEE de 8 bytes.TEXT
. El valor es una cadena de texto, almacenada usando la codificación de la base de datos (UTF-8, UTF-16BE o UTF-16LE).BLOB
. El valor es una masa de datos, almacenada exactamente como se ingresó.fuente
Como una adición a la respuesta de dan04, si desea insertar ciegamente un
NUMERIC
otro que no sea cero representado por un,TEXT
pero asegúrese de que el texto sea convertible a numérico:El caso de uso típico es una consulta de un programa que trata todos los datos como texto (para uniformidad y simplicidad, ya que SQLite ya lo hace). Lo bueno de esto es que permite construcciones como esta:
lo cual es conveniente en caso de que esté usando marcadores de posición porque no tiene que manejar campos numéricos distintos de cero especialmente. Un ejemplo usando el
sqlite3
módulo de Python sería,En el ejemplo anterior, todos los valores de
str_value_tuple
se escaparán y se citarán como cadenas cuando se pasen a SQlite. Sin embargo, dado que no estamos verificando explícitamente el tipo a través,TYPEOF
sino solo la convertibilidad a tipo , seguirá funcionando como se desee (es decir, SQLite lo almacenará como numérico o fallará de otra manera).fuente