En SQLite, hay bastantes formas de ver la estructura de una tabla. Por lo tanto, hay bastantes formas de verificar el tipo de datos de las columnas dentro de esa tabla.
También hay una función que nos permite comprobar el tipo de datos de una columna devuelta en una consulta.
Aquí hay cinco formas de verificar el tipo de datos de una columna en SQLite.
El PRAGMA table_info()
Declaración
PRAGMA table_info()
La declaración devuelve información sobre una tabla específica, incluidas sus columnas y tipos de datos.
Este es un ejemplo de devolución de información sobre una tabla llamada Album
.
PRAGMA table_info(Album);
Resultado:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
En este caso, las columnas se crearon con su tipo de datos explícitamente definido.
Aquí hay otro ejemplo:
PRAGMA table_info(Events);
Resultado:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
En este caso, solo la primera columna tiene su tipo de datos explícitamente definido.
SQLite utiliza un enfoque diferente a los tipos de datos que los otros RDBMS principales. SQLite utiliza un sistema de tipado dinámico, por lo que el tipo de datos de un valor se asocia con el valor en sí, no con su contenedor.
Dicho esto, SQLite nos permite especificar explícitamente el tipo de datos de las columnas. En los ejemplos anteriores, algunas columnas se crearon con su tipo de datos explícitamente definido, y podemos ver cuáles son esos tipos de datos ejecutando el PRAGMA
anterior. declaración.
La PRAGMA table_xinfo()
Declaración
PRAGMA table_xinfo()
declaración es exactamente la misma que PRAGMA table_info()
instrucción, excepto que también devuelve columnas ocultas en tablas virtuales:
PRAGMA table_xinfo(Album);
Resultado:
cid name type notnull dflt_value pk hidden --- -------- ------------- ------- ---------- -- ------ 0 AlbumId INTEGER 1 1 0 1 Title NVARCHAR(160) 1 0 0 2 ArtistId INTEGER 1 0 0
Podemos ver que es básicamente lo mismo que table_info()
, excepto con la columna extra.
El .schema
Comando
Otra forma de recuperar la estructura de una tabla es usando .schema
dominio. Este es uno de varios métodos que puede utilizar para devolver el SQL utilizado para crear la tabla.
Ejemplo:
.schema Album
Resultado:
CREATE TABLE Chinook.[Album] ( [AlbumId] INTEGER NOT NULL, [Title] NVARCHAR(160) NOT NULL, [ArtistId] INTEGER NOT NULL, CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]), FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId]) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE INDEX Chinook.[IFK_AlbumArtistId] ON [Album] ([ArtistId]);
Este método nos permite generar el SQL necesario para recrear la tabla, incluida la especificación de cualquier tipo de datos.
El sqlite_schema
Mesa
Puede usar el sqlite_schema
table a lo mismo que el ejemplo anterior.
Aquí hay un ejemplo usando la misma tabla.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Resultado:
CREATE TABLE [Album] ( [AlbumId] INTEGER NOT NULL, [Title] NVARCHAR(160) NOT NULL, [ArtistId] INTEGER NOT NULL, CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]), FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId]) ON DELETE NO ACTION ON UPDATE NO ACTION ) CREATE INDEX [IFK_AlbumArtistId] ON [Album] ([ArtistId])
El sqlite_schema
también se puede acceder a la tabla usando sqlite_master
.
El typeof()
Función
Puedes usar el typeof()
función para obtener el tipo de datos de una columna devuelta por una consulta. Más específicamente, devuelve el tipo de datos de la expresión dada.
Ejemplo:
SELECT typeof(Title) FROM Album
LIMIT 1;
Resultado:
text
Aquí usé el LIMIT
cláusula para limitar el resultado a una sola fila, de lo contrario, veríamos el mismo resultado repetido para cada fila de la tabla.
Tenga en cuenta que este método devuelve el tipo de datos de la expresión devuelta por la consulta, no el tipo de datos real asignado a la columna. Los posibles tipos devueltos son:
null
integer
real
text
blob
A cada columna de una base de datos SQLite se le asigna una de las afinidades de tipo anteriores.
Estos se conocen como clases de almacenamiento. Una clase de almacenamiento es más general que un tipo de datos. Todos los valores de las sentencias de SQL, ya sean literales incrustados en el texto de la sentencia de SQL o parámetros vinculados a sentencias de SQL precompiladas, tienen una clase de almacenamiento implícita. El motor de la base de datos puede convertir valores entre clases de almacenamiento numérico (INTEGER
y REAL
) y TEXT
durante la ejecución de la consulta.
Más información sobre tipos de datos en SQLite
Consulte Tipos de datos de SQLite (documentación de SQLite) y Las ventajas de la escritura flexible (documentación de SQLite) para obtener más información sobre los tipos de datos en SQLite.
Ver también STRICT
tablas (documentación de SQLite), una función que se agregó en la versión 3.37.0 de SQLite el 27 de noviembre de 2021 que nos permite rechazar el sistema de escritura flexible y, en su lugar, aplicar el sistema de escritura rígido tradicional que se encuentra en todos los demás motores de base de datos SQL y en el estándar SQL.