321 votes

Stocker une valeur booléenne dans SQLite

Quel est le type d'une valeur BOOL en SQLite ? Je veux stocker dans ma table des valeurs TRUE/FALSE.

Je pourrais créer une colonne de type INTEGER et y stocker les valeurs 0 ou 1, mais ce ne sera pas la meilleure façon d'implémenter le type BOOL.

Y a-t-il un moyen ?

0 votes

Bien que SQLite n'ait pas de type de données booléen, il supporte littéraux booléens

401voto

Lasse V. Karlsen Points 148037

Il n'existe pas de type de données booléen natif pour SQLite. Selon la Document sur les types de données :

SQLite ne dispose pas d'une classe de stockage booléenne distincte. Au lieu de cela, les valeurs booléennes sont stockées comme des entiers 0 (faux) et 1 (vrai).

26 votes

"INTEGER. La valeur est un entier signé, stocké dans 1, 2, 3, 4, 6 ou 8 octets selon l'ampleur de la valeur." Je suppose qu'utiliser 1 octet pour stocker un BOOL n'est pas si mal.

3 votes

Qu'est-ce qui est le mieux en termes de performance ? Vrai/faux en tant que chaînes de caractères ou entier 0/1 ?

10 votes

@MuhammadBabar 0/1 très certainement. Les cordes sont plus lentes et prennent plus de place.

120voto

ericwa Points 250

En SQLite, le mieux que vous puissiez faire est d'utiliser les entiers 0 et 1 pour représenter le faux et le vrai. Vous pourriez déclarer le type de colonne comme ceci :

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0, 1)));

Omettre le NOT NULL si vous voulez permettre NULL en plus de 0 et 1.

L'utilisation du nom de type BOOLEAN ici est pour la lisibilité, pour SQLite c'est juste un type avec une affinité NUMERIQUE .

Notez que Contraintes de CHECK ont été soutenus depuis SQLite 3.3.0 (2006).

Voici quelques exemples d'INSERTs qui fonctionneront : (notez comment les chaînes de caractères et les nombres à virgule flottante sont analysés comme des entiers)

sqlite> INSERT INTO foo VALUES(0);
sqlite> INSERT INTO foo VALUES(1);
sqlite> INSERT INTO foo VALUES(0.0);
sqlite> INSERT INTO foo VALUES(1.0);
sqlite> INSERT INTO foo VALUES("0.0");
sqlite> INSERT INTO foo VALUES("1.0");
sqlite> select mycolumn, typeof(mycolumn) from foo;
0|integer
1|integer
0|integer
1|integer
0|integer
1|integer

et d'autres qui vont échouer :

sqlite> INSERT INTO foo VALUES("-1");
Error: constraint failed
sqlite> INSERT INTO foo VALUES(0.24);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(100);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(NULL);
Error: foo.mycolumn may not be NULL
sqlite> INSERT INTO foo VALUES("true");
Error: constraint failed
sqlite> INSERT INTO foo VALUES("false");
Error: constraint failed

0 votes

Attention - si vous définissez un DEFAULT vous devez le régler sur DEFAULT 0 o DEFAULT 1 plutôt que FALSE / TRUE sur certaines machines. Apparemment, certaines versions de Linux n'aiment pas cela, bien que cela fonctionne bien avec Groovy.

0 votes

Un petit ajout. Dans la version 3.28.0, les insertions true/false sans guillemets seront exécutées avec succès : INSERT INTO foo VALUES(true) ; INSERT INTO foo VALUES(false) ; Aussi true/false sans guillemets peut être utilisé dans CHECK et dans DEFAULT.

91voto

SQLite Boolean Datatype :
SQLite ne dispose pas d'une classe de stockage booléenne distincte. Au lieu de cela, les valeurs booléennes sont stockées comme des entiers 0 (faux) et 1 (vrai).

Vous pouvez convertir un booléen en int de cette manière :

int flag = (boolValue)? 1 : 0;

Vous pouvez reconvertir int en booléen comme suit :

 // Select COLUMN_NAME  values from db. 
 // This will be integer value, you can convert this int value back to Boolean as follows
Boolean flag2 = (intValue == 1)? true : false;

Si vous voulez explorer sqlite, voici un tutoriel .
J'ai donné une réponse aquí . Cela fonctionne pour eux.

14 votes

La dernière ligne de code pourrait être "Boolean flag2 = (intValue == 1)".

16 votes

Je propose Boolean flag2 = (intValue != 0);

0 votes

Ou vous pouvez simplement faire Boolean flag2 = (intValue > 0) ;

8voto

L'utilisation du type de données Integer avec les valeurs 0 et 1 est la plus rapide.

2voto

Vous pouvez simplifier les équations ci-dessus en utilisant ce qui suit :

boolean flag = sqlInt != 0;

Si la représentation int (sqlInt) du booléen est 0 (faux), le booléen (flag) sera faux, sinon il sera vrai.

Il est toujours plus agréable de travailler avec un code concis :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X