Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Forums FAQ Tutoriels SQL Livres Access DB2 Firebird InterBase Mysql Oracle PostGreSQL SQL-Server Sybase


Manipuler les masques de bits

3 juillet 2004
MAJ: 4 juillet 2004

Par Fabien Celaia (Fadace)

Certains champs, surtout dans les tables système de MS-SQL ou de sybase ASE, stockent des infromations sous forme de masque de bits. Souvent l'utilisateur rechigne à utiliser ce genre de champ par méconnaissance. Ce petit document à pour but de vous familiariser avec ce type de données. Vous aprouverez rapidement qu'un masque de bits n'est pas si compliqué qu'il en à l'air...

Quelques exemples de champs des tables système:

Moteur Table Colonne
Sybase ASE
MS-SQL
master..sysdatabases status
status2
Sybase ASE master..sysdatabases status3
MS-SQL master..sysdatabases category
MS-SQL master..sysdatabases category
Sybase ASE
MS-SQL
master..sysdevices status
cntrltype
Sybase ASE master..syssegments status

L'idée de base est de stocker dans un champ unique plusieurs informations.

Imaginons que l'on veuille specifier 4 options cumulables. Un enregistrement pourrait donc avoir 0 à 4 options. La façon lisible que l'on utilise generalement est la suivante:

create table MasqueBit  
(
MonChamp vachar(30) primary key,  
option1 bit,  
option2 bit,  
option3 bit,  
option4 bits
)

On aurait donc des tuples de type {"monchamp1",1,1,0,1} ou encore {"monchamp2",0,1,0,0}. Le problème majeure de cette façon de faire et qu'un nombre important d'options génère autant de colonnes dans la table. de plus, l'ajout d'une option supplémentaire modifie la structure (le DDL, pour les initiés) de la table, avec tout ce que cela implique comme risque de cas de bord lorsque l'on touche aux tables système.

L'idée du masque est de stocker tout le quadruplet final dans un champ binaire, soit - en reprenant notre exemple précédent - {"monchamp1",1101} et {"monchamp2",0100}.

Ne pouvant stocker du binaire sous cette forme, on a imaginé remplacer cette mantisse par le chiffre correspondant en élevant chaqun des bits activés à sa puissance de 2, soit

monchamp1 => 1101 => 1*23+1*22 + 0*21+1*20 = 13
monchamp2 => 0100 => 0*23+1*22 + 0*21+0*20 = 4

Maintenant que nous stockons toute l'info dans un champ unique, il faut appliquer un masque binaire pour retrouver l'information qui nous intéresse. Si l'on désire les valeurs dont l'option 4 est activée, nous ferons donc

SELECT * 
FROM MasqueBit  
WHERE OptionBit & 1 = 1	

Si on désire les options 2 et 4 activées, on fera donc

SELECT * 
FROM MasqueBit  
WHERE OptionBit & 5 = 5

5 étant égal à 4 + 1 = 0x23+1*22+0*21+1*20, soit notre fameux masque 0101.

L'opérateur & permet donc d'appliquer le masque sur le champ numérique afin de retourner la valeur cherchée si elle existe, ou sinon 0.

Vous voyez par vous même que tous ces champs incongrus n'auront bientôt plus de secret pour vous et votre table de multiplication de 2...

Autre lien sur ce sujet Une seule colonne, plusieurs données... par SQLPro

Copyright © Fadace. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique SQL & SGBD : Benjamin Gagneux et Frédéric Dubois - Contacter par EMail :
Vos questions techniques : forum d'entraide SQL & SGBD - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.