sql >> Base de Datos >  >> RDS >> SQLite

5 formas de verificar el tipo de datos de una columna en SQLite

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.