Rumah  >  Soal Jawab  >  teks badan

Tidak dapat menetapkan pembolehubah BOOL MySQL kepada nilai BOOL JSON?

<p>Versi MySQL: 8.0.27</p> <p>Ini tidak masuk akal bagi saya. Saya mempunyai definisi berikut: </p> <pre class="brush:php;toolbar:false;">DECLARE p_array_only bool DEFAULT IFNULL(JSON_EXTRACT(in_parameters, '$.array_only'),FALSE);</pre> <p>Jika saya lulus struktur JSON yang betul: </p> <pre class="brush:php;toolbar:false;">{"array_only":true}</pre> <p>Saya mendapat ralat: </p> <pre class="brush:php;toolbar:false;">Nilai 'true' untuk lajur 'p_array_only' dalam baris 1 adalah salah</pre> <p>Perhatikan bahawa jika saya meninggalkan kunci sepenuhnya, ia berfungsi (kerana IFNULL mengembalikan Null dan ditetapkan kepada FALSE). </p> <p>Apa yang berlaku? Semua tugasan kod lain daripada JSON berfungsi dengan baik (INT, Teks, SMALLINT, dll.) - formatnya adalah sama. Dan saya pasti kod ini akan berfungsi beberapa bulan yang lalu (menggunakan 8.0.24). </p> <p>Saya pun mencuba: </p> <pre class="brush:php;toolbar:false;">IFNULL(IF(JSON_EXTRACT(@test1, '$.array_only') ADALAH BENAR, BENAR, SALAH), SALAH)</pre> <p>Ralat yang sama. </p> <p>Jadi, bagaimanakah saya boleh menukar nilai BOOL JSON benar/salah kepada nilai MySQL BOOL dalam 8.0.27? </p>
P粉707235568P粉707235568413 hari yang lalu455

membalas semua(1)saya akan balas

  • P粉541796322

    P粉5417963222023-09-04 00:14:38

    BOOLEAN bukan jenis data terbina dalam dalam MySQL. Ia adalah alias dan dilaksanakan sebagai TINYINT(1).

    Lihat https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html


    Gunakan penukaran jenis data tersirat:

    DECLARE p_array_only BOOL 
        DEFAULT IFNULL(0 + JSON_EXTRACT(in_parameter, '$.array_only'), FALSE);

    Gagal jika nilai yang sepadan adalah daripada jenis rentetan atau null.

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=9c5fac2c7533d9e365a449ce00c06f1b

    PS. Bentuk pendek DEFAULT IFNULL(0 + in_parameter->'$.array_only', FALSE); juga berguna.

    PPS Sudah tentu, CAST() eksplisit juga boleh digunakan.

    balas
    0
  • Batalbalas