’ai renconté un petit problème sous mysql. Je voulais tester dans un trigger qu’une saisie de l’utilisateur n’était pas vide, le champ concerné étant de type entier, il pouvait prendre plein de valeurs possibles, dont le 0.
Là ou ça devient rigolo, c’est que normalement MySQL considère tout comme des chaînes de caractères, le cast est implicite :
mysql> SELECT 42.3456 = '42.3456';
+---------------------+
| 42.3456 = '42.3456' |
+---------------------+
| 1 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT CAST(42.3456 AS CHAR) = ‘42.3456′;
+———————————–+
| CAST(42.3456 AS CHAR) = ‘42.3456′ |
+———————————–+
| 1 |
+———————————–+
1 row in set (0.00 sec)
Super, ça simplifie la vie tout ça !
Sauf que pas de bol, pour MySQL, le 0 est un numérique particulier.
mysql> SELECT 0 = '';
+--------+
| 0 = '' |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
Et oui, pour comparer une variable numérique dans une routine sous mysql à la chaine vide, il faut caster, sinon le zéro passe à la trappounette.
mysql> SELECT CAST(0 AS CHAR) = '';
+----------------------+
| CAST(0 AS CHAR) = '' |
+----------------------+
| 0 |
+----------------------+
1 row in set (0.00 sec)
Voilà, j’ai cherché un peu dans la documentation et via google, mais je n’ai pas trouvé d’explication. Donc si quelqu’un à un lien ou des explications…
# Comme un tableur
Posté par pnb666 . Évalué à 3.
Non ?
# comparons ce qui est comparable
Posté par NeoX . Évalué à 2.
'' est surement aussi un caractere
dans ton cas si la personne n'a rien rempli il faut peut-etre comparer avec NULL ou null (soit l'equivalent d'une variable non definie)
je peux aussi me tromper cu qu'on est vendredi
[^] # Re: comparons ce qui est comparable
Posté par Axel . Évalué à 2.
Je pourrais aussi vérifier en PHP que la saisie n'est pas '' et le cas échéant passer NULL comme paramètre à la requete, mais je ne voulais pas multiplier les tests et dans le PHP et dans le SQL, donc je testais uniquement en SQL : IS NOT NULL AND != ''. Avec 0 = '', forcément ça ne marchait pas avant que je caste.
[^] # Re: comparons ce qui est comparable
Posté par Jean Meyrand . Évalué à 1.
bon je dis ca, mais en general, je la joue mode multi parano :
javascript qui va bien
verification en PHP
contraintes NOT NULL dans la base.
[^] # Re: comparons ce qui est comparable
Posté par Axel . Évalué à 2.
Le champ en question est soit saisi par l'utilisateur, soit automatiquement calculé et validé dans un trigger. Dans tous les cas la valeur ne sera jamais à NULL au final.
Alors pourquoi ne pas mettre "NOT NULL" ? Parce que (malheureusement? peut etre, je ne connais pas le comportement des autres SGBDs) sous mysql les triggers sont incompatibles avec les champs not null , dans un certain sens:
L'application de la contrainte NOT NULL se fait avant l'execution du trigger BEFORE de la table.
Si on définit un champ "NOT NULL", et qu'on ne le spécifie pas dans la requete d'insertion, puisque de toute facçon le trigger va le définir, mysql rejette quand même l'insertion à cause de la contrainte NOT NULL.
Au début je croyais que mysql exécutait le trigger before, et une fois celui ci terminé, validait les contraintes sur les champs comme le NOT NULL, mais en fait non. Le trigger s'execute après que mysql aie vérifié que les valeurs de l'INSERT correspondent aux contraintes.
C'est bête, ça oblige à mettre des NULLs qui en fait sont des NOT NULL.
D'ailleurs si quelqu'un connait le comportement de pgsql ou d'autres SGBDs dans ce genre de cas...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.