Attention avec les enum '0','1'
Citation:
Envoyé par
foxdie
Je préfère également la solution avec le type ENUM qui est plus 'sécurisée' mais le problème est qu'il s'agit d'une énumération de chaîne de caractères uniquement. Du coup une requête du tpye :
SELECT * FROM matable WHERE monpseudobooleen = 1
ne fonctionnera pas, il faut mettre des quotes et écrire :
SELECT * FROM matable WHERE monpseudobooleen = '1'
Y-a-t-il moyen de contourner cette contrainte ? :?
Là je te recommande de faire très attention avec les enum. Car cela joue des tours pendables !!!!
Prenon un exemple avec l'enum suivant
mon_champ ENUM('small', 'medium', 'large')
si tu fait un
Code:
SELECT * FROM matable WHERE mon_champ = 2
le 2 est un entier et mysql va le caster en enum. pour caster un entier en enum il faut savoir que chaque valeur à un index et que mysql commence à partir de 1 et c'est cet index qui est utilisé pour le cast. Dans notre cas le 2 sera casté en 'medium'.
1 => 'small'
2 => 'medium'
3 => 'large'
Jusque là rien de bien méchant...
Maintenant regardons avec l'exemple de foxdie
monpseudobooleen ENUM('0','1')
1 => '0'
2 => '1'
Premier cas.
Code:
SELECT * FROM matable WHERE monpseudobooleen = 0
Dans ce cas mysql ne retournera aucun enregistrement. Ce qui est curieux c'est que si tu met un entier qui n'est pas un index de ton enum il n'y aura aucun warning ni erreur ... :?
Pire encore
Code:
SELECT * FROM matable WHERE monpseudobooleen = 1
Dans ce cas le 1 va être casté en '0' ... Ce qui fait que la requette aura l'effet inverse de celui attendu. :aie:
Juste pour info je me suis fait baisé plusieurs fois et sur un site on a eu des newsletter qui sont parties chez tous les gens qui s'étaient désinscrit et pas chez les autres :yaisse2:
Moi je suis plutôt partisant du tinyint car tu n'as pas de mauvaise surprise.