W SQLite istnieje wiele sposobów patrzenia na strukturę tabeli. Dlatego istnieje wiele sposobów sprawdzenia typu danych kolumn w tej tabeli.
Dostępna jest również funkcja, która pozwala nam sprawdzić typ danych kolumny zwróconej w zapytaniu.
Oto pięć sposobów sprawdzenia typu danych kolumny w SQLite.
PRAGMA table_info()
Oświadczenie
PRAGMA table_info()
instrukcja zwraca informacje o określonej tabeli, w tym o jej kolumnach i typach danych.
Oto przykład zwracania informacji o tabeli o nazwie Album
.
PRAGMA table_info(Album);
Wynik:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
W tym przypadku kolumny zostały utworzone z wyraźnie zdefiniowanym typem danych.
Oto kolejny przykład:
PRAGMA table_info(Events);
Wynik:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
W takim przypadku tylko pierwsza kolumna ma jawnie zdefiniowany typ danych.
SQLite używa innego podejścia do typów danych niż inne główne systemy RDBMS. SQLite używa dynamicznego systemu typowania, więc typ danych wartości jest powiązany z samą wartością, a nie z jej kontenerem.
To powiedziawszy, SQLite pozwala nam jawnie określić typ danych kolumn. W powyższych przykładach niektóre kolumny zostały utworzone z wyraźnie zdefiniowanym typem danych i możemy zobaczyć, jakie są te typy danych, uruchamiając powyższy PRAGMA
oświadczenie.
PRAGMA table_xinfo()
Oświadczenie
PRAGMA table_xinfo()
instrukcja jest dokładnie taka sama jak PRAGMA table_info()
z wyjątkiem tego, że zwraca również ukryte kolumny w wirtualnych tabelach:
PRAGMA table_xinfo(Album);
Wynik:
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
Widzimy, że jest to w zasadzie to samo co table_info()
, z wyjątkiem dodatkowej kolumny.
.schema
Polecenie
Innym sposobem na pobranie struktury tabeli jest użycie .schema
Komenda. Jest to jedna z kilku metod, których możesz użyć do zwrócenia kodu SQL użytego do utworzenia tabeli.
Przykład:
.schema Album
Wynik:
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]);
Ta metoda pozwala nam na wygenerowanie kodu SQL wymaganego do odtworzenia tabeli – w tym określenie dowolnych typów danych.
sqlite_schema
Tabela
Możesz użyć sqlite_schema
tabeli do tego samego, co w poprzednim przykładzie.
Oto przykład przy użyciu tej samej tabeli.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Wynik:
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
dostęp do tabeli można również uzyskać za pomocą sqlite_master
.
typeof()
Funkcja
Możesz użyć typeof()
funkcja, aby uzyskać typ danych kolumny zwróconej przez zapytanie. Dokładniej, zwraca typ danych danego wyrażenia.
Przykład:
SELECT typeof(Title) FROM Album
LIMIT 1;
Wynik:
text
Tutaj użyłem LIMIT
klauzula ograniczająca wynik tylko do jednego wiersza, w przeciwnym razie zobaczylibyśmy ten sam wynik powtórzony dla każdego wiersza w tabeli.
Należy pamiętać, że ta metoda zwraca typ danych wyrażenia zwróconego przez zapytanie, a nie rzeczywisty typ danych przypisany do kolumny. Możliwe zwrócone typy to:
null
integer
real
text
blob
Każda kolumna w bazie danych SQLite ma przypisane jedno z powyższych powinowactw.
W rzeczywistości są one określane jako klasy pamięci. Klasa pamięci jest bardziej ogólna niż typ danych. Wszystkie wartości w instrukcjach SQL, niezależnie od tego, czy są to literały osadzone w tekście instrukcji SQL, czy parametry powiązane z prekompilowanymi instrukcjami SQL, mają niejawną klasę pamięci. Silnik bazy danych może konwertować wartości między numerycznymi klasami pamięci (INTEGER
i REAL
) i TEXT
podczas wykonywania zapytania.
Więcej informacji o typach danych w SQLite
Zobacz typy danych SQLite (dokumentacja SQLite) i zalety elastycznego pisania (dokumentacja SQLite), aby uzyskać więcej informacji o typach danych w SQLite.
Zobacz także STRICT
tabele (dokumentacja SQLite), funkcja dodana w wersji 3.37.0 SQLite 27.11.2021, która pozwala nam odrzucić elastyczny system typowania i zamiast tego wymuszać tradycyjny, sztywny system typowania, który można znaleźć we wszystkich innych silnikach baz danych SQL oraz w standard SQL.