7.2.7.4 Le type SET

Un ensemble est une chaîne qui peut avoir aucune, une ou plusieurs valeurs, chaque valeur étant choisie dans une liste de valeur autorisées lors de la création de la table. Les valeurs de type SET qui ont plusieurs valeurs sont spécifiées en séparant les membres par des virgules(``,'').. Par conséquent, les valeurs de type SET ne peuvent pas contenir de virgule.

Par exemple, une colonne de type SET("un", "deux") NOT NULL peut prendre les valeurs suivantes :

""
"un"
"deux"
"un, deux"

Un ensemble peut avoir un maximum de 64 membres distincts.

MySQL enregistre les valeurs de type SET values numériquement, avec le premier élément situé au bit de poids faible. Lorsqu'une valeur de type SET est retournée dans un contexte numérique, les bits à 1 de cette valeurs correspondent à un membre du SET qui appartienne à cette valeur. Si un nombre est enregistré dans une valeur de type SET, alors les bits mis à un de ce nombre détermineront les membres du SET qui appartiennent à la valeur. Par exemple, une colonne a été spécifiée par SET("a","b","c","d").Alors, les membres prennent la valeur suivante :

SET member Decimal value Binary value
a 1 0001
b 2 0010
c 4 0100
d 8 1000

Pour les valeurs qui contiennent plus d'un membre, l'ordre d'insertion n'importe pas. Une valeur peut être insérée plusieurs fois, elle n'apparaîtra plus qu'une seule fois dans le SET, et sera placé dans l'ordre des membres, à la création du SET. Par exemple, dans une colonne de type SET("a","b","c","d"), alors les valeurs "a, d", "d, a" et "d,a,a,d,d" seront devenues "a, d", lorsqu'elle seront retournées par la base.

Les valeurs de type s SET ont triées par ordre numérique. La valeur NULL est placée avant toutes les autres valeurs non- NULL.

En général, il est possible d'utiliser la clause SELECT sur une colonne de type SET, en utilisant l'opérateur LIKE ou la fonction FIND_IN_SET().

mysql> SELECT * FROM Nom_table WHERE Nom_col LIKE '%valeur%';
mysql> SELECT * FROM Nom_table WHERE FIND_IN_SET(valeur, Nom_col)>0;

Mais les exemples suivants sont aussi corrects

mysql> SELECT * FROM Nom_table WHERE Nom_col = 'val1,val2';
mysql> SELECT * FROM Nom_table WHERE Nom_col & 1;

le premier exemple recherche une valeur exacte ('val1,val2'). Le second exemple recherche les valeurs qui contiennent le premier élément.

Pour visualiser toutes les valeurs d'une colonne de type, il faut utiliser SHOW COLUMNS FROM Nom_table LIKE Nom_col_enum et détailler les valeurs de la deuxième colonne.