Impossible de définir la variable BOOL de MySQL sur la valeur BOOL d'un JSON ?
P粉707235568
2023-09-03 10:57:44
<p>Version MySQL : 8.0.27</p>
<p>Cela n’a aucun sens pour moi. J'ai la définition suivante : </p>
<pre class="brush:php;toolbar:false;">DECLARE p_array_only bool DEFAULT IFNULL(JSON_EXTRACT(in_parameters, '$.array_only'),FALSE);</pre>
<p>Si je transmets une structure JSON correcte : </p>
<pre class="brush:php;toolbar:false;">{"array_only":true}</pre>
<p>J'obtiens l'erreur : </p>
<pre class="brush:php;toolbar:false;">La valeur 'true' pour la colonne 'p_array_only' dans la ligne 1 est incorrecte</pre>
<p>Notez que si j'omets complètement la clé, cela fonctionne (car IFNULL renvoie Null et est défini sur FALSE). </p>
<p>Que s’est-il passé ? Toutes les autres affectations de code JSON fonctionnent correctement (INT, Text, SMALLINT, etc.) - le format est exactement le même. Et je suis sûr que ce code aurait fonctionné il y a quelques mois (en utilisant la version 8.0.24). </p>
<p>J'ai même essayé : </p>
<pre class="brush:php;toolbar:false;">IFNULL(IF(JSON_EXTRACT(@test1, '$.array_only') IS TRUE,TRUE,FALSE),FALSE)</pre>
<p>Même erreur. </p>
<p>Alors, comment puis-je simplement convertir une valeur BOOL JSON vrai/faux en une valeur BOOL MySQL dans la version 8.0.27 ? </p>
BOOLEAN n'est pas un type de données intégré à MySQL. Il s'agit d'un alias implémenté sous la forme TINYINT(1).
Voir https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html
Utiliser la conversion implicite du type de données :
Échoue si la valeur correspondante est de type chaîne ou
null
.https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=9c5fac2c7533d9e365a449ce00c06f1b
PS. Le formulaire court
DEFAULT IFNULL(0 + in_parameter->'$.array_only', FALSE);
est également utile.PPS Bien sûr, CAST() explicite peut également être utilisé.