No SQLite, existem algumas maneiras de observar a estrutura de uma tabela. Portanto, existem algumas maneiras de verificar o tipo de dados das colunas nessa tabela.
Há também uma função que nos permite verificar o tipo de dados de uma coluna retornada em uma consulta.
Aqui estão cinco maneiras de verificar o tipo de dados de uma coluna no SQLite.
O PRAGMA table_info()
Declaração
O
PRAGMA table_info()
A instrução retorna informações sobre uma tabela especificada, incluindo suas colunas e tipos de dados. Aqui está um exemplo de retorno de informações sobre uma tabela chamada
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
Neste caso, as colunas foram criadas com seu tipo de dados explicitamente definido.
Aqui está outro exemplo:
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
Nesse caso, apenas a primeira coluna tem seu tipo de dados definido explicitamente.
SQLite usa uma abordagem diferente para tipos de dados do que os outros RDBMSs principais. O SQLite usa um sistema de tipagem dinâmico e, portanto, o tipo de dados de um valor é associado ao próprio valor, não ao seu contêiner.
Dito isso, o SQLite nos permite especificar explicitamente o tipo de dados das colunas. Nos exemplos acima, algumas colunas foram criadas com seus tipos de dados definidos explicitamente, e podemos ver quais são esses tipos de dados executando o
PRAGMA
acima demonstração. A PRAGMA table_xinfo()
Declaração
O
PRAGMA table_xinfo()
instrução é exatamente a mesma que a PRAGMA table_info()
instrução, exceto que também retorna colunas ocultas em tabelas virtuais: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 é basicamente o mesmo que
table_info()
, exceto com a coluna extra. O .schema
Comando
Outra maneira de recuperar a estrutura de uma tabela é usando o
.schema
comando. Este é um dos vários métodos que você pode usar para retornar o SQL usado para criar a tabela. Exemplo:
.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]);
Esse método nos permite gerar o SQL necessário para recriar a tabela – incluindo a especificação de quaisquer tipos de dados.
O sqlite_schema
Tabela
Você pode usar o
sqlite_schema
table para a mesma coisa que o exemplo anterior. Aqui está um exemplo usando a mesma tabela.
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])
O
sqlite_schema
tabela também pode ser acessada usando sqlite_master
. O typeof()
Função
Você pode usar o
typeof()
função para obter o tipo de dados de uma coluna retornada por uma consulta. Mais especificamente, ele retorna o tipo de dados da expressão fornecida. Exemplo:
SELECT typeof(Title) FROM Album
LIMIT 1;
Resultado:
text
Aqui eu usei o
LIMIT
cláusula para limitar o resultado a apenas uma linha, caso contrário, veríamos o mesmo resultado repetido para cada linha da tabela. Lembre-se de que esse método retorna o tipo de dados da expressão retornada pela consulta – não o tipo de dados real atribuído à coluna. Os tipos possíveis retornados são:
null
integer
real
text
blob
Cada coluna em um banco de dados SQLite é atribuída a uma das afinidades de tipo acima.
Na verdade, elas são chamadas de classes de armazenamento. Uma classe de armazenamento é mais geral que um tipo de dados. Todos os valores em instruções SQL, sejam literais incorporados no texto da instrução SQL ou parâmetros vinculados a instruções SQL pré-compiladas, têm uma classe de armazenamento implícita. O mecanismo de banco de dados pode converter valores entre classes de armazenamento numérico (
INTEGER
e REAL
) e TEXT
durante a execução da consulta. Mais informações sobre tipos de dados no SQLite
Consulte Tipos de dados SQLite (documentação do SQLite) e As vantagens da digitação flexível (documentação do SQLite) para obter mais informações sobre os tipos de dados no SQLite.
Veja também
STRICT
tabelas (documentação do SQLite), um recurso que foi adicionado no SQLite versão 3.37.0 em 27/11/2021 que nos permite recusar o sistema de digitação flexível e, em vez disso, aplicar o sistema de tipo rígido tradicional encontrado em todos os outros mecanismos de banco de dados SQL e em o padrão SQL.