Code : SQL
espece SET('chat', 'chien', 'tortue')
On pourra stocker dans cette colonne :
'' (chaîne vide ) ;
'chat' ;
'chat,tortue' ;
'chat,chien,tortue' ;
'chien,tortue' ;
...
Vous remarquerez que lorsqu'on stocke plusieurs valeurs, il faut les séparer par une virgule, sans espace et entourer la totalité
des valeurs par des guillemets (non pas chaque valeur séparément). Par conséquent, les valeurs autorisées d'une colonne SET
ne peuvent pas contenir de virgule elles-mêmes.
On ne peut pas stocker la même valeur plusieurs fois dans un SET. "chien,chien" par exemple, n'est donc pas valable.
Les colonnes SET utilisent également un système d'index, quoiqu'un peu plus complexe que pour le type ENUM. SET utilise en
effet un système d'index binaire. Concrètement, la présence/absence des valeurs autorisées va être enregistrée sous forme de
bits, mis à 1 si la valeur correspondante est présente, à 0 si la valeur correspondante est absente.
Si l'on reprend notre exemple, on a donc :
Code : SQL
espece SET('chat', 'chien', 'tortue')
Trois valeurs sont autorisées. Il nous faut donc trois bits pour savoir quelles valeurs sont stockées dans le champ. Le premier, à
droite, correspondra à "chat", le second (au milieu) à "chien" et le dernier (à gauche) à "tortue".
000 signifie qu'aucune valeur n'est présente.
001 signifie que 'chat' est présent.
100 signifie que 'tortue' est présent.
110 signifie que 'chien' et 'tortue' sont présents.
...
Par ailleurs, ces suites de bits représentent des nombres en binaire convertibles en décimal. Ainsi 000 en binaire correspond à 0
en nombre décimal, 001 correspond à 1, 010 correspond à 2, 011 à 3...
Puisque j'aime bien les tableaux, je vous en fais un, ce sera peut-être plus clair.
Valeur Binaire Décimal
'chat'
001
1
'chien' 010
2
'tortue' 100
4
Pour stocker 'chat' et 'tortue' dans un champ, on peut donc utiliser 'chat,tortue' ou 101 (addition des nombres binaires
correspondants) ou 5 (addition des nombres décimaux correspondants).
Notez que cette utilisation des binaires a pour conséquence que l'ordre dans lequel vous rentrez vos valeurs n'a pas
d'importance. Que vous écriviez 'chat,tortue' ou 'tortue,chat' ne fait aucune différence. Lorsque vous récupérerez votre champ,
vous aurez 'chat,tortue' (dans le même ordre que lors de la définition du champ).
Un champ de type SET peut avoir au plus 64 valeurs définies
Partie 1 : MySQL et les bases du langage SQL
30/414
www.openclassrooms.com
espece SET('chat', 'chien', 'tortue')
On pourra stocker dans cette colonne :
'' (chaîne vide ) ;
'chat' ;
'chat,tortue' ;
'chat,chien,tortue' ;
'chien,tortue' ;
...
Vous remarquerez que lorsqu'on stocke plusieurs valeurs, il faut les séparer par une virgule, sans espace et entourer la totalité
des valeurs par des guillemets (non pas chaque valeur séparément). Par conséquent, les valeurs autorisées d'une colonne SET
ne peuvent pas contenir de virgule elles-mêmes.
On ne peut pas stocker la même valeur plusieurs fois dans un SET. "chien,chien" par exemple, n'est donc pas valable.
Les colonnes SET utilisent également un système d'index, quoiqu'un peu plus complexe que pour le type ENUM. SET utilise en
effet un système d'index binaire. Concrètement, la présence/absence des valeurs autorisées va être enregistrée sous forme de
bits, mis à 1 si la valeur correspondante est présente, à 0 si la valeur correspondante est absente.
Si l'on reprend notre exemple, on a donc :
Code : SQL
espece SET('chat', 'chien', 'tortue')
Trois valeurs sont autorisées. Il nous faut donc trois bits pour savoir quelles valeurs sont stockées dans le champ. Le premier, à
droite, correspondra à "chat", le second (au milieu) à "chien" et le dernier (à gauche) à "tortue".
000 signifie qu'aucune valeur n'est présente.
001 signifie que 'chat' est présent.
100 signifie que 'tortue' est présent.
110 signifie que 'chien' et 'tortue' sont présents.
...
Par ailleurs, ces suites de bits représentent des nombres en binaire convertibles en décimal. Ainsi 000 en binaire correspond à 0
en nombre décimal, 001 correspond à 1, 010 correspond à 2, 011 à 3...
Puisque j'aime bien les tableaux, je vous en fais un, ce sera peut-être plus clair.
Valeur Binaire Décimal
'chat'
001
1
'chien' 010
2
'tortue' 100
4
Pour stocker 'chat' et 'tortue' dans un champ, on peut donc utiliser 'chat,tortue' ou 101 (addition des nombres binaires
correspondants) ou 5 (addition des nombres décimaux correspondants).
Notez que cette utilisation des binaires a pour conséquence que l'ordre dans lequel vous rentrez vos valeurs n'a pas
d'importance. Que vous écriviez 'chat,tortue' ou 'tortue,chat' ne fait aucune différence. Lorsque vous récupérerez votre champ,
vous aurez 'chat,tortue' (dans le même ordre que lors de la définition du champ).
Un champ de type SET peut avoir au plus 64 valeurs définies
Partie 1 : MySQL et les bases du langage SQL
30/414
www.openclassrooms.com
