Dans SQLite, il existe plusieurs façons de regarder la structure d'une table. Par conséquent, il existe plusieurs façons de vérifier le type de données des colonnes de cette table.
Il existe également une fonction qui nous permet de vérifier le type de données d'une colonne renvoyée dans une requête.
Voici cinq façons de vérifier le type de données d'une colonne dans SQLite.
Le PRAGMA table_info()
Déclaration
Le PRAGMA table_info()
L'instruction renvoie des informations sur une table spécifiée, y compris ses colonnes et ses types de données.
Voici un exemple de retour d'informations sur une table appelée Album
.
PRAGMA table_info(Album);
Résultat :
cid name type notnull dflt_value pk --- -------- ------------- ------- ---------- -- 0 AlbumId INTEGER 1 1 1 Title NVARCHAR(160) 1 0 2 ArtistId INTEGER 1 0
Dans ce cas, les colonnes ont été créées avec leur type de données explicitement défini.
Voici un autre exemple :
PRAGMA table_info(Events);
Résultat :
cid name type notnull dflt_value pk --- --------- ------- ------- ---------- -- 0 EventId INTEGER 0 1 1 EventName 0 0 2 StartDate 0 0 3 EndDate 0 0
Dans ce cas, seule la première colonne a son type de données explicitement défini.
SQLite utilise une approche des types de données différente de celle des autres principaux SGBDR. SQLite utilise un système de typage dynamique, et ainsi le type de données d'une valeur est associé à la valeur elle-même, et non à son conteneur.
Cela dit, SQLite nous permet de spécifier explicitement le type de données des colonnes. Dans les exemples ci-dessus, certaines colonnes ont été créées avec leur type de données explicitement défini, et nous pouvons voir quels sont ces types de données en exécutant le PRAGMA
ci-dessus déclaration.
Le PRAGMA table_xinfo()
Déclaration
Le PRAGMA table_xinfo()
est exactement la même que la PRAGMA table_info()
, sauf qu'elle renvoie également les colonnes masquées sur les tables virtuelles :
PRAGMA table_xinfo(Album);
Résultat :
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
Nous pouvons voir que c'est fondamentalement la même chose que table_info()
, sauf avec la colonne supplémentaire.
Le .schema
Commande
Une autre façon de récupérer la structure d'une table est d'utiliser le .schema
commande. Il s'agit de l'une des nombreuses méthodes que vous pouvez utiliser pour renvoyer le SQL utilisé pour créer la table.
Exemple :
.schema Album
Résultat :
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]);
Cette méthode nous permet de générer le SQL requis pour recréer la table, y compris en spécifiant tous les types de données.
Le sqlite_schema
Tableau
Vous pouvez utiliser le sqlite_schema
table à la même chose que l'exemple précédent.
Voici un exemple utilisant le même tableau.
SELECT sql
FROM Chinook.sqlite_schema
WHERE tbl_name = 'Album';
Résultat :
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])
Le sqlite_schema
la table est également accessible à l'aide de sqlite_master
.
Le typeof()
Fonction
Vous pouvez utiliser le typeof()
fonction pour obtenir le type de données d'une colonne renvoyée par une requête. Plus précisément, il renvoie le type de données de l'expression donnée.
Exemple :
SELECT typeof(Title) FROM Album
LIMIT 1;
Résultat :
text
Ici, j'ai utilisé le LIMIT
clause pour limiter le résultat à une seule ligne, sinon nous verrions le même résultat répété pour chaque ligne du tableau.
Gardez à l'esprit que cette méthode renvoie le type de données de l'expression renvoyée par la requête, et non le type de données réel affecté à la colonne. Les types possibles renvoyés sont :
null
integer
real
text
blob
Chaque colonne d'une base de données SQLite se voit attribuer l'une des affinités de type ci-dessus.
Celles-ci sont en fait appelées classes de stockage. Une classe de stockage est plus générale qu'un type de données. Toutes les valeurs des instructions SQL, qu'il s'agisse de littéraux incorporés dans le texte de l'instruction SQL ou de paramètres liés à des instructions SQL précompilées, ont une classe de stockage implicite. Le moteur de base de données peut convertir des valeurs entre les classes de stockage numériques (INTEGER
et REAL
) et TEXT
lors de l'exécution de la requête.
Plus d'informations sur les types de données dans SQLite
Voir Types de données SQLite (documentation SQLite) et The Advantages Of Flexible Typing (documentation SQLite) pour plus d'informations sur les types de données dans SQLite.
Voir aussi STRICT
tables (documentation SQLite), une fonctionnalité qui a été ajoutée dans la version 3.37.0 de SQLite le 2021-11-27 qui nous permet de refuser le système de typage flexible et d'appliquer à la place le système de type rigide traditionnel que l'on trouve dans tous les autres moteurs de base de données SQL et dans la norme SQL.