¿Cuál es la diferencia entre los tipos de datos SQLite relacionados como INT, INTEGER, SMALLINT y TINYINT?
sqlite tipos de datos (5)
Al crear una tabla en SQLite3, me confundo cuando me enfrento a todos los posibles tipos de datos que implican contenidos similares, así que ¿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 el min./max. capacidades de los diversos tipos de datos? Por ejemplo, supongo que smallint
contiene un valor máximo mayor que tinyint
, pero un valor menor que entero, pero no tengo idea de cuáles son estas capacidades.
Como complemento a la respuesta de dan04, si desea insertar ciegamente un NUMERIC
distinto de cero representado por un TEXT
pero asegúrese de que el texto sea convertible a numérico:
your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)
El caso típico de uso se encuentra en una consulta de un programa que trata todos los datos como texto (por uniformidad y simplicidad, ya que SQLite ya lo hace). Lo bueno de esto es que permite construcciones como esta:
INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)
lo cual es conveniente en caso de que use marcadores de posición porque no tiene que manejar dichos campos numéricos distintos de cero especialmente. Un ejemplo usando sqlite3
módulo sqlite3
de Python sería,
conn_or_cursor.execute(
"INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",
str_value_tuple) # no need to convert some from str to int/float
En el ejemplo anterior, todos los valores en str_value_tuple
se escapan y se citan como cadenas cuando se pasan a SQlite. Sin embargo, dado que no estamos verificando explícitamente el tipo mediante TYPEOF
sino solo la convertibilidad a tipo , seguirá funcionando como desee (es decir, SQLite lo almacenará como un valor numérico o fallará de lo contrario).
La diferencia es azúcar sintáctica. Solo unas pocas subcadenas de los nombres de tipo importan tanto como la afinidad de tipo.
- INT, INTEGER, SMALLINT, TINYINT → INTEGER afinidad, porque todas contienen "INT".
- LONGCHAR, LONGVARCHAR → TEXT afinidad, porque contienen "CHAR".
- DEC, DECIMAL, DATETIME, SMALLDATETIME → NUMERIC, porque no contienen ninguna de las subcadenas que importan.
Las reglas para determinar la afinidad se enumeran en el sitio SQLite .
Si insiste en el tipado estricto, puede implementarlo con restricciones CHECK
:
CREATE TABLE T (
N INTEGER CHECK(TYPEOF(N) = ''integer''),
Str TEXT CHECK(TYPEOF(Str) = ''text''),
Dt DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);
Pero nunca me molesto con eso.
En cuanto a la capacidad de cada tipo:
-
INTEGER
siempre está firmado de 64 bits. Tenga en cuenta que SQLite optimiza el storage de enteros pequeños detrás de las escenas, por lo que TINYINT no sería útil de todos modos. -
REAL
es siempre de 64 bits (double
). -
TEXT
yBLOB
tienen un tamaño máximo determinado por una macro de preprocesador, que por defecto es de 1,000,000,000 de bytes.
La mayoría de ellos están ahí para compatibilidad. Realmente solo tiene números enteros, float, text y blob. Las fechas se pueden almacenar como un número (el tiempo de Unix es entero, el tiempo de Microsoft es flotante) o como texto.
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 punto flotante, almacenado como un número de punto 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 un conjunto de datos, almacenados exactamente como se ingresaron.
SQLite
, técnicamente, no tiene tipos de datos, hay clases de almacenamiento en un sistema de tipado de manifiesto, y sí, es confuso si está acostumbrado a los RDBMS
tradicionales. Todo, internamente, se almacena como texto. Los tipos de datos son forzados / convertidos en varias ubicaciones de almacenamiento basadas en afinidades (tipos de datos ala asignados a columnas).
Lo mejor que te recomiendo que hagas es:
Olvida temporalmente todo lo que solías saber sobre los tipos de datos de la base de datos independiente
Lea el enlace de arriba del sitio
SQLite
.Tome los tipos basados en su esquema anterior y vea a qué se asignarían en
SQLite
Migre todos los datos a la
SQLite
datosSQLite
.
Nota: Las limitaciones del tipo de datos pueden ser engorrosas, especialmente si agrega duraciones de tiempo, fechas o cosas de esa naturaleza en SQL
. SQLite
tiene muy pocas funciones integradas para ese tipo de cosas. Sin embargo, SQLite
proporciona una manera fácil de realizar sus propias funciones integradas para agregar duraciones de tiempo y cosas de esa naturaleza, a través de la sqlite3_create_function
biblioteca sqlite3_create_function
. Utilizaría esa instalación en lugar de los procedimientos almacenados tradicionales.