В SQLite има доста начини да разгледате структурата на таблицата. Следователно има доста начини, по които можем да проверим типа данни на колоните в тази таблица.
Има и функция, която ни позволява да проверим типа данни на колона, върната в заявка.
Ето пет начина за проверка на типа данни на колона в SQLite.
PRAGMA table_info()
Изявление
PRAGMA table_info()
оператор връща информация за определена таблица, включително нейните колони и типове данни.
Ето пример за връщане на информация за таблица, наречена Album
.
PRAGMA table_info(Album);
Резултат:
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
В този случай колоните са създадени с изрично дефиниран тип данни.
Ето още един пример:
PRAGMA table_info(Events);
Резултат:
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
В този случай само първата колона има изрично дефиниран тип данни.
SQLite използва различен подход към типовете данни от другите основни RDBMS. SQLite използва динамична система за въвеждане и така типът данни на стойност се свързва със самата стойност, а не с нейния контейнер.
Въпреки това SQLite ни позволява изрично да посочим типа данни на колоните. В горните примери бяха създадени някои колони с изрично дефиниран тип данни и можем да видим какви са тези типове данни, като изпълним горната PRAGMA
изявление.
PRAGMA table_xinfo()
Изявление
PRAGMA table_xinfo()
операторът е точно същият като PRAGMA table_info()
оператор, с изключение на това, че връща и скрити колони във виртуални таблици:
PRAGMA table_xinfo(Album);
Резултат:
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
Можем да видим, че по същество е същото като table_info()
, освен с допълнителната колона.
.schema
Команда
Друг начин за извличане на структурата на таблица е с помощта на .schema
команда. Това е един от няколкото метода, които можете да използвате, за да върнете SQL, използван за създаване на таблицата.
Пример:
.schema Album
Резултат:
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]);
Този метод ни позволява да генерираме SQL, необходим за пресъздаване на таблицата – включително посочване на всякакви типове данни.
sqlite_schema
Таблица
Можете да използвате sqlite_schema
таблица към същото нещо като предишния пример.
Ето пример за използване на същата таблица.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Резултат:
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
таблицата може да бъде достъпна и чрез sqlite_master
.
typeof()
Функция
Можете да използвате typeof()
функция, за да получите типа данни на колона, върната от заявка. По-конкретно, той връща типа данни на дадения израз.
Пример:
SELECT typeof(Title) FROM Album
LIMIT 1;
Резултат:
text
Тук използвах LIMIT
клауза за ограничаване на резултата само до един ред, в противен случай ще видим, че същият резултат се повтаря за всеки ред в таблицата.
Имайте предвид, че този метод връща типа данни на израза, върнат от заявката, а не действителния тип данни, присвоен на колоната. Възможните върнати типове са:
null
integer
real
text
blob
На всяка колона в база данни на SQLite е присвоен един от горните типове афинитети.
Те всъщност се наричат класове за съхранение. Класът за съхранение е по-общ от тип данни. Всички стойности в SQL изрази, независимо дали са литерали, вградени в текст на SQL изрази, или параметри, обвързани с предварително компилирани SQL изрази, имат имплицитен клас за съхранение. Машината на базата данни може да преобразува стойности между числови класове за съхранение (INTEGER
и REAL
) и TEXT
по време на изпълнение на заявката.
Повече информация за типовете данни в SQLite
Вижте SQLite типове данни (документация за SQLite) и предимствата на гъвкавото писане (документация на SQLite) за повече информация относно типовете данни в SQLite.
Вижте също STRICT
таблици (документация на SQLite), функция, която беше добавена в SQLite версия 3.37.0 на 2021-11-27, която ни позволява да откажем гъвкавата система за въвеждане и вместо това да наложим традиционната система с твърд тип, намираща се във всички други машини за бази данни на SQL и в стандарта SQL.