In SQLite, ci sono diversi modi per guardare la struttura di una tabella. Pertanto, ci sono diversi modi in cui possiamo controllare il tipo di dati delle colonne all'interno di quella tabella.
C'è anche una funzione che ci permette di controllare il tipo di dati di una colonna restituita in una query.
Ecco cinque modi per controllare il tipo di dati di una colonna in SQLite.
Il PRAGMA table_info()
Dichiarazione
Il PRAGMA table_info()
istruzione restituisce informazioni su una tabella specificata, comprese le relative colonne e tipi di dati.
Ecco un esempio di restituzione di informazioni su una tabella chiamata Album
.
PRAGMA table_info(Album);
Risultato:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
In questo caso, le colonne sono state create con il tipo di dati definito in modo esplicito.
Ecco un altro esempio:
PRAGMA table_info(Events);
Risultato:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
In questo caso, solo la prima colonna ha il tipo di dati definito in modo esplicito.
SQLite utilizza un approccio diverso ai tipi di dati rispetto agli altri principali RDBMS. SQLite utilizza un sistema di tipizzazione dinamica, quindi il tipo di dati di un valore è associato al valore stesso, non al suo contenitore.
Detto questo, SQLite ci consente di specificare esplicitamente il tipo di dati delle colonne. Negli esempi precedenti, alcune colonne sono state create con il loro tipo di dati definito in modo esplicito e possiamo vedere quali sono questi tipi di dati eseguendo il PRAGMA
sopra dichiarazione.
Il PRAGMA table_xinfo()
Dichiarazione
La PRAGMA table_xinfo()
è esattamente la stessa di PRAGMA table_info()
istruzione, tranne per il fatto che restituisce anche colonne nascoste su tabelle virtuali:
PRAGMA table_xinfo(Album);
Risultato:
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
Possiamo vedere che è sostanzialmente lo stesso di table_info()
, eccetto con la colonna extra.
Il .schema
Comando
Un altro modo per recuperare la struttura di una tabella è utilizzare .schema
comando. Questo è uno dei tanti metodi che puoi usare per restituire l'SQL usato per creare la tabella.
Esempio:
.schema Album
Risultato:
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]);
Questo metodo ci consente di generare l'SQL richiesto per ricreare la tabella, inclusa la specifica di qualsiasi tipo di dati.
Lo sqlite_schema
Tabella
Puoi usare lo sqlite_schema
tabella alla stessa cosa dell'esempio precedente.
Ecco un esempio che utilizza la stessa tabella.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Risultato:
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])
Lo sqlite_schema
è possibile accedere alla tabella anche utilizzando sqlite_master
.
Il typeof()
Funzione
Puoi usare typeof()
funzione per ottenere il tipo di dati di una colonna restituita da una query. Più specificamente, restituisce il tipo di dati dell'espressione data.
Esempio:
SELECT typeof(Title) FROM Album
LIMIT 1;
Risultato:
text
Qui ho usato il LIMIT
clausola per limitare il risultato a una sola riga, altrimenti vedremmo lo stesso risultato ripetuto per ogni riga della tabella.
Tieni presente che questo metodo restituisce il tipo di dati dell'espressione restituita dalla query, non il tipo di dati effettivo assegnato alla colonna. I possibili tipi restituiti sono:
null
integer
real
text
blob
A ogni colonna in un database SQLite viene assegnata una delle affinità di tipo sopra.
Queste sono in realtà denominate classi di archiviazione. Una classe di archiviazione è più generale di un tipo di dati. Tutti i valori nelle istruzioni SQL, siano essi letterali incorporati nel testo dell'istruzione SQL o parametri associati a istruzioni SQL precompilate, hanno una classe di archiviazione implicita. Il motore di database può convertire valori tra classi di archiviazione numeriche (INTEGER
e REAL
) e TEXT
durante l'esecuzione della query.
Ulteriori informazioni sui tipi di dati in SQLite
Vedere i tipi di dati SQLite (documentazione SQLite) e I vantaggi della digitazione flessibile (documentazione SQLite) per ulteriori informazioni sui tipi di dati in SQLite.
Vedi anche STRICT
tabelle (documentazione SQLite), una funzionalità che è stata aggiunta in SQLite versione 3.37.0 il 27-11-2021 che ci consente di rifiutare il sistema di tipizzazione flessibile e invece di applicare il tradizionale sistema di tipi rigidi che si trova in tutti gli altri motori di database SQL e in lo standard SQL.