lundi, 13 août 2007

Types ENUM avec MySQL

Toujours en train de travailler avec MySQL, et encore pour un bon moment, voici une particularité du type enum :

Soit un champ field2 :

`field2` enum('0','1') NOT NULL default '0'
Soit une requête :
SELECT * FROM ... WHERE ... AND field2 = 1
Le résultat de cette requête est intéressant dans le sens où MySQL va sélectionner tous les tuples dont la valeur du champ field2 vaut '0'. Pourquoi cela ? Parce qu'en passant le 1 sous forme d'entier, MySQL va l'associer à la première valeur de l'énumération, '0' donc. Dans le même ordre d'idée WHERE ... AND field2 = 2 sélectionnera tous les tuples dont field2 vaut '1'.

La requête

SELECT * FROM ... WHERE ... AND field2 = '1'
fournira quant à elle la juste réponse. Attention donc avec les types des valeurs, surtout en PHP...

2 commentaires:

MrTuTu a dit…

Je me demande toujours (et il faudrait que je fasse le test): sachant que faire un enum de valeurs entières (qui seront stockées sous forme de chaines) n'a pas d'autre sens que d'empêcher d'entrer des valeurs autres que celles énumérées, pourquoi ne pas faire un trigger à l'insertion et la modification ?

Et quelle est la différence de performance?

KillerWhile a dit…

La différence en terme de performance est drastique ! En gros c'est la différence entre un test de valeur et le lancement d'une procédure. Sans parler du jour ou tu devras ajouter une valeur à l'énumération :)