par
Hubert Roksor » 12 avr. 2008, 05:16
plus rapide pour les requetes
Surprise ! ENUM est aussi rapide qu'un INT. En fait, ENUM stocke des nombres (index), pas des chaînes. Voir
http://dev.mysql.com/doc/refman/5.0/fr/enum.html
ENUM permet aussi de se passer de valeurs magiques. Plus facile pour celui qui maintient le script à jour de comprendre ce que "WHERE frequence = 'parfois'" signifie, comparé à "WHERE frequence = 3" (3 quoi ?).
Dans la même famille, MySQL possède le type SET, qui fait la même chose sauf qu'au lieu de choisir 1 valeur parmi 65535, on choisit de 0 à 64 valeurs parmi 64. Par exemple, dans le catalogue d'un concessionnaire on pourrait avoir une colonne "carburant" SET('essence','diesel','GPL'). Un modèle de voiture pourrait être disponible en essence, en diesel, les 2, etc...
Ces deux types ont pour défaut de nécessiter de modifier la table si on veut modifier la liste des valeurs. Pire encore, il est déconseillé de modifier des valeurs existantes parce que les enregistrements ne sont pas mis à jour. Par exemple, si ton ENUM('garçon', 'fille') est modifié en ENUM('unisexe', 'garçon', 'fille') ben tous les enregistrements 'garçon' vont désormais apparaître en 'unisexe' et les enregistrements 'filles' apparaîtront en 'garçon'. Comme je le disais plus haut, ENUM stocke l'
index de la valeur, pas la valeur elle-même. C'est pour ça que dans ce cas, il faut ajouter les nouvelles valeurs
à la fin de la liste, eg ENUM('garçon', 'fille', 'unisexe')
Je ne recommande pas non plus d'essayer de stocker des nombres dans ENUM, parce que c'est un type chaîne et il y a un risque de confusion. Quand on insère un nombre comme valeur pour un ENUM, le nombre est interprété comme la position dans la liste.
Ce n'est pas comme PHP où 1 == '1'. Par exemple, si vous utiliser ENUM('0','1') pour émuler un oui/non, vous risquez d'avoir ce genre de surprises
Code : Tout sélectionner
mysql> CREATE TABLE e (col ENUM('0','1'));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO e VALUES (1);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM e;
+------+
| col |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
...on insère 1 et on se retrouve avec '0' ?! Ben oui, '0' est à l'
index 1 de l'ENUM. Utilisez ENUM('oui','non') à la place, aucun risque d'erreur avec ça.
[quote="steph29"]plus rapide pour les requetes[/quote]
Surprise ! ENUM est aussi rapide qu'un INT. En fait, ENUM stocke des nombres (index), pas des chaînes. Voir http://dev.mysql.com/doc/refman/5.0/fr/enum.html
ENUM permet aussi de se passer de valeurs magiques. Plus facile pour celui qui maintient le script à jour de comprendre ce que "WHERE frequence = 'parfois'" signifie, comparé à "WHERE frequence = 3" (3 quoi ?).
Dans la même famille, MySQL possède le type SET, qui fait la même chose sauf qu'au lieu de choisir 1 valeur parmi 65535, on choisit de 0 à 64 valeurs parmi 64. Par exemple, dans le catalogue d'un concessionnaire on pourrait avoir une colonne "carburant" SET('essence','diesel','GPL'). Un modèle de voiture pourrait être disponible en essence, en diesel, les 2, etc...
Ces deux types ont pour défaut de nécessiter de modifier la table si on veut modifier la liste des valeurs. Pire encore, il est déconseillé de modifier des valeurs existantes parce que les enregistrements ne sont pas mis à jour. Par exemple, si ton ENUM('garçon', 'fille') est modifié en ENUM('unisexe', 'garçon', 'fille') ben tous les enregistrements 'garçon' vont désormais apparaître en 'unisexe' et les enregistrements 'filles' apparaîtront en 'garçon'. Comme je le disais plus haut, ENUM stocke l'[i]index[/i] de la valeur, pas la valeur elle-même. C'est pour ça que dans ce cas, il faut ajouter les nouvelles valeurs [u]à la fin[/u] de la liste, eg ENUM('garçon', 'fille', 'unisexe')
Je ne recommande pas non plus d'essayer de stocker des nombres dans ENUM, parce que c'est un type chaîne et il y a un risque de confusion. Quand on insère un nombre comme valeur pour un ENUM, le nombre est interprété comme la position dans la liste. [u]Ce n'est pas comme PHP[/u] où 1 == '1'. Par exemple, si vous utiliser ENUM('0','1') pour émuler un oui/non, vous risquez d'avoir ce genre de surprises
[code]mysql> CREATE TABLE e (col ENUM('0','1'));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO e VALUES (1);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM e;
+------+
| col |
+------+
| 0 |
+------+
1 row in set (0.00 sec)[/code]
...on insère 1 et on se retrouve avec '0' ?! Ben oui, '0' est à l'[i]index 1[/i] de l'ENUM. Utilisez ENUM('oui','non') à la place, aucun risque d'erreur avec ça.