By : Sergey Gigoyan | Mis à jour : 2020-06-29 | Commentaires | Connexe : Plus > Types de données
Problème
Dans le développement de bases de données, il existe certains cas particuliers où il est nécessaire de travailler avec le type de données booléen. Il s’agit d’un type de données qui ne permet que deux valeurs possibles « Vrai » ou « Faux ». En clair, si une variable ou une colonne ne peut avoir que deux valeurs possibles, il sera plus facile et logique de définir son type comme booléen. Ainsi, SQL Server dispose-t-il du type booléen ou d’un type de données similaire ? Dans SQL Server, il n’existe pas de type de données appelé booléen. Cependant, il existe un type de données appelé bit qui peut être utilisé pour stocker des valeurs booléennes. Dans cet article, nous allons présenter etexplorer le type de données bit de SQL Server.
Solution
Le type de données bit de SQL Server est un type de données entier qui ne peut prendre qu’une de ces valeurs : 0, 1, NULL. En ce qui concerne le stockage, s’il y a moins de 9 colonnes de données binaires dans la table, elles sont stockées sur 1 octet. S’il y a de 9 à 16 colonnes de ce type, elles consomment 2 octets et ainsi de suite. Ainsi, le serveur SQL optimise le stockage des colonnes de type données binaires. De plus, les valeurs de chaînes de caractères TRUE etFALSE peuvent être converties en 1 et 0 correspondant à des valeurs de bits.
Caractéristiques
Maintenant, explorons les caractéristiques et les spécifications du type de données bit. Tout d’abord,comme il est mentionné ci-dessus, les chaînes de caractères ‘VRAI’ et ‘FAUX’ sont converties en 1 et 0. Ce comportement est illustré dans l’exemple suivant :
DECLARE @isUsed BITDECLARE @isUsedStr NCHAR(5) SELECT @isUsed AS BitType, @isUsedStr AS String --TRUE is converted to 1SET @isUsedStr='TRUE' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String --FALSE is converted to 0SET @isUsedStr='FALSE' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String --Assigning any other string value to a bit variable causes an errorSET @isUsedStr='YES' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String
Dans le code ci-dessus, nous avons déclaré deux variables – une du type de données bit et l’autre du type de données chaîne. Ensuite, nous assignons la chaîne de caractères à une variable du type de données bit. Comme nous pouvons le voir, les valeurs ‘TRUE’ et ‘FALSE’ sont converties avec succès en valeurs correspondantes (1 et 0) du type de données bit:
L’affectation de toute autre chaîne à une variable bit, cependant, provoque une erreur. Dans notreexemple, nous avons assigné ‘YES’ à une variable binaire et avons reçu une erreur :
Deuxièmement, il est important de mentionner que l’affectation de toute valeur non nulle à un type de données binaires le convertit en 1. Dans l’exemple suivant, nous assignons des entiers positifs et négatifs à une variable du type de données bit :
DECLARE @isUsed BIT SELECT @isUsed AS BitType --Assigning any nonzero value converts it to 1SET @isUsed=9 SELECT @isUsed AS BitType --Assigning any nonzero value converts it to 1SET @isUsed=-100 SELECT @isUsed AS BitType
Le résultat montre que dans les deux cas, la valeur de la variable bit est 1 :
Avantages du type de données bit du serveur SQL
Comme il est mentionné ci-dessus, si nous avons moins de 9 colonnes du type de données bit dans notre table, elles sont stockées comme un octet. Par conséquent, la question pourrait se poser : pourquoi utiliser le bit au lieu de char(1) ou tinynint si nous n’avons qu’une seule colonne dans la tableacceptant uniquement des valeurs booléennes ? Eh bien, créons un environnement de test et voyons l’exemple suivant:
USE masterGO CREATE DATABASE TestDBGO USE TestDBGO CREATE TABLE .( NOT NULL PRIMARY KEY, (1) NULL, NULL, )GO
Nous avons créé la base de données TestDB et une table échantillon stockant les résultats des tests médicaux des patients. On suppose que le sexe ne peut être que ‘Male’, ‘Female’, ‘Unknown’, ‘Undefined’ ou ‘other’. Pour les deux premiers cas, nous utiliserons ‘M’ et ‘F’ respectivement et pour les trois derniers cas, nous utiliserons ‘NULL’. Pour faciliter notre exemple, nous supposons également que les résultats des tests peuvent être positifs ou négatifs (NULL sera considéré comme inconnu). Les types de données (char(1) et tinyint) choisis dans la définition du tableau ne sont toutefois pas suffisants pour mettre en œuvre cette logique. Nous devons nous assurer que les colonnes mentionnées ne peuvent pas accepter d’autres valeurs. Par conséquent, nous devons créer des contraintes de contrôle :
USE GO --Adding check constraintsALTER TABLE . WITH CHECK ADD CONSTRAINT CHECK ((='M' OR ='F'))GO ALTER TABLE . CHECK CONSTRAINT GO ALTER TABLE . WITH CHECK ADD CONSTRAINT CHECK ((=(1) OR =(0)))GO
En revanche, si nous utilisons le type de données bit pour les colonnes Sexe et Test1Résultat,nous n’avons pas besoin de créer des contraintes de contrôle :
USE TestDBGO DROP TABLE .GO CREATE TABLE .( NOT NULL PRIMARY KEY, NULL, NULL)GO
Pour la colonne Gender, nous pouvons considérer 1 comme un homme, par exemple, 0 comme une femmeet NULL comme inconnu, indéfini ou autre. En ce qui concerne le Test1Result, nous pouvonsconsidérer 1 comme un positif et 0 comme un négatif.
En termes d’optimisation du stockage, le principal avantage est que si nous avons plusieurs colonnesBooléennes, en utilisant le type de bit, nous pouvons réduire considérablement l’espace utilisé. Comme exemple simple, nous pouvons utiliser un tableau qui stocke les résultats de plusieurs tests médicaux des patients (qui sont soit positifs soit négatifs):
USE TestDBGO DROP TABLE .GO CREATE TABLE .( NOT NULL PRIMARY KEY, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)GO
Ici, nous avons 8 colonnes du type de données bit et, par conséquent, 1 octet est utilisé pour stocker les valeurs. Si nous utilisions plutôt le tinyint ou le char(1), 1 octet serait utilisé pour chacune d’elles.
Nous pouvons également tirer des avantages de l’utilisation du type de données bit dans les fonctions ou les procédures stockées qui acceptent ou renvoient des valeurs booléennes. Supposons que nous ayons besoin d’une fonctionqui vérifiera si un patient est testé ou non. De toute évidence, la fonction renverra VRAI ou FAUX. Ainsi, nous pouvons utiliser le type de données bit comme type de valeur de retour:
USE TestDBGO CREATE FUNCTION isPatientTested( @PatientID INT)RETURNS bitASBEGIN IF EXISTS (SELECT PatientID FROM PatientTestResults WHERE ) RETURN 1 RETURN 0 ENDGONow, we can easily call this boolean function:USE TestDBGO IF (dbo.isPatientTested(1)=1) PRINT 'The patient is tested'ELSE PRINT 'The patient is not tested'
Nous pouvons voir que le patient n’est pas testé car il n’y a pas d’enregistrement pour le patientavec PatientID=1 :
Conclusion
En conclusion, le type de données bit peut être très utile si les colonnesou les variables n’acceptent que deux valeurs (plus NULL). Dans ces cas, l’utilisation du type bit au lieu des types de données string ou tinyint peut rendre le code plus logique et compact. En outre, comme SQL Server optimise le stockage des colonnes bit, l’utilisation de ce type peut économiser du stockage, en particulier si nous avons plus de 8 colonnes de type de données bit dans la table.
Prochaines étapes
Pour trouver plus d’informations sur le sujet traité, veuillez suivre les liens ci-dessous :
- https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15
Dernière mise à jour : 2020-06-29
À propos de l’auteur
Voir tous mes conseils
- Plus de conseils pour les développeurs de bases de données…
.