I SQLite finns det en hel del sätt att titta på en tabells struktur. Därför finns det en hel del sätt vi kan kontrollera datatypen för kolumnerna i den tabellen.
Det finns också en funktion som låter oss kontrollera datatypen för en kolumn som returneras i en fråga.
Här är fem sätt att kontrollera datatypen för en kolumn i SQLite.
PRAGMA table_info()
Uttalande
PRAGMA table_info()
sats returnerar information om en specificerad tabell, inklusive dess kolumner och datatyper.
Här är ett exempel på att returnera information om en tabell som heter Album
.
PRAGMA table_info(Album);
Resultat:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
I det här fallet skapades kolumnerna med deras datatyp uttryckligen definierad.
Här är ett annat exempel:
PRAGMA table_info(Events);
Resultat:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
I det här fallet har endast den första kolumnen sin datatyp explicit definierad.
SQLite använder en annan metod för datatyper än de andra stora RDBMS:erna. SQLite använder ett dynamiskt skrivsystem, så datatypen för ett värde är associerad med själva värdet, inte med dess behållare.
Som sagt, SQLite tillåter oss att explicit specificera datatypen för kolumner. I exemplen ovan skapades vissa kolumner med deras datatyp uttryckligen definierad, och vi kan se vilka dessa datatyper är genom att köra ovanstående PRAGMA
uttalande.
PRAGMA table_xinfo()
Uttalande
PRAGMA table_xinfo()
satsen är exakt samma som PRAGMA table_info()
uttalande, förutom att den också returnerar dolda kolumner på virtuella tabeller:
PRAGMA table_xinfo(Album);
Resultat:
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
Vi kan se att det i princip är detsamma som table_info()
, förutom med den extra kolumnen.
.schema
Kommando
Ett annat sätt att hämta en tabells struktur är att använda .schema
kommando. Detta är en av flera metoder du kan använda för att returnera den SQL som användes för att skapa tabellen.
Exempel:
.schema Album
Resultat:
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]);
Den här metoden tillåter oss att generera den SQL som krävs för att återskapa tabellen – inklusive att specificera eventuella datatyper.
sqlite_schema
Tabell
Du kan använda sqlite_schema
tabell till samma sak som föregående exempel.
Här är ett exempel med samma tabell.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Resultat:
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])
sqlite_schema
Tabellen kan också nås med sqlite_master
.
typeof()
Funktion
Du kan använda typeof()
funktion för att få datatypen för en kolumn returnerad av en fråga. Mer specifikt returnerar den datatypen för det givna uttrycket.
Exempel:
SELECT typeof(Title) FROM Album
LIMIT 1;
Resultat:
text
Här använde jag LIMIT
sats för att begränsa resultatet till bara en rad, annars skulle vi se samma resultat upprepat för varje rad i tabellen.
Tänk på att den här metoden returnerar datatypen för uttrycket som returneras av frågan – inte den faktiska datatypen som tilldelats kolumnen. De möjliga typerna som returneras är:
null
integer
real
text
blob
Varje kolumn i en SQLite-databas tilldelas en av ovanstående typaffiniteter.
Dessa kallas faktiskt lagringsklasser. En lagringsklass är mer allmän än en datatyp. Alla värden i SQL-satser, oavsett om de är bokstavliga inbäddade i SQL-satstext eller parametrar bundna till förkompilerade SQL-satser, har en implicit lagringsklass. Databasmotorn kan konvertera värden mellan numeriska lagringsklasser (INTEGER
och REAL
) och TEXT
under körning av en fråga.
Mer information om datatyper i SQLite
Se SQLite-datatyper (SQLite-dokumentation) och The Advantages Of Flexible Typing (SQLite-dokumentation) för mer information om datatyper i SQLite.
Se även STRICT
tabeller (SQLite-dokumentation), en funktion som lades till i SQLite version 3.37.0 2021-11-27 som gör att vi kan vägra det flexibla skrivsystemet och istället tillämpa det traditionella system med stela typ som finns i alla andra SQL-databasmotorer och i SQL-standarden.