Table mysql champ enum

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Table mysql champ enum

par stakanof » 18 mai 2008, 15:58

Ok , merci

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.

par Patriboom » 12 avr. 2008, 03:25

Enum est très pratique si plusieurs personnes fouinent directement dans la base de données. Ça contraint à la discipline dans les réponses à donner à certains champs.

par Ryle » 12 avr. 2008, 01:24

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".


Je partage un peu l'avis de steph29 et n'utilise pas particulièrement de type enum. Quoi qu'il en soit, le premier intérêt que l'on peut y voir, c'est l'intégrité de ta base.

Le jour où dans ton champ de type int tu te retrouves avec un 0 ou un 4, ton appli pourrait ne plus fonctionner correctement et tu passerais un temps fou à essayer de comprendre d'où il peuvent provenir. L'enum te garantie les valeurs que tu vas pouvoir trouver dans le champ.

Et tout en ayant une gestion applicative avec $choix=array("1"=>'oui',"2"=>'non',"3"=>'je ne sais pas'); on peut avoir une contrainte dans la base qui serait enum(1,2,3).

par steph29 » 11 avr. 2008, 18:07

c'est utilise pour restreindre le nb de valeur possible dans la base, mais ce type de restrictions ne doit pas etre fait par la bdd mais par l'applicatif.

pour ma part c'est obsolete... j'ai tendance a mettre un int avec un tableau de config en php.

sinon pour l'exemple:

au lieu d'avoir un enum('oui','non',je ne sais pas')

je prefere un :
$choix=array("1"=>'oui',"2"=>'non',"3"=>'je ne sais pas');
avec dans la bdd un int avec l'id de mon tableau choix insere.

plus rapide pour les requetes, facilite de maintenance, facilite de traduction (surcharge de $choix), etc.

Table mysql champ enum

par stakanof » 11 avr. 2008, 17:35

Bonjour,

Dans une table Mysql un champ peut être de type enum (liste définie de valeurs )

Je ne vois pas trop l'intérêt de cette option, quelqu'un aurait il un exemple.