Forum Programmation.SQL comparaison de chaines et mysql

Posté par  .
Étiquettes : aucune
0
14
déc.
2007
’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  . Évalué à 3.

    c certainement du a la meme phylosophie des tableurs qui considaire que une chaine vide est egal a 0 !?

    Non ?
  • # comparons ce qui est comparable

    Posté par  . Évalué à 2.

    0 est un caractere
    '' 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  . Évalué à 2.

      Seulement, ce qui est passé à la requete SQL provient de code PHP.
      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  . Évalué à 1.

        il ne serait pas plus simple d'avoir une contrainte NOT NULL dans la base?

        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  . Évalué à 2.

          Je vais essayer de résumer :

          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.