確認したバージョンは、MySQL8.0.25。
JSONのtrue/falseを参照してMySQLのboolean(tinyint)にする時、ついうっかりvarchar等と同じ感覚でjson_unquote
をするとエラーになる。
テスト用の定義
create table test1 ( |
間違い
insert into test1 set id = 1, data = '{"name":"hello", "flag1": true, "flag2": true}'; |
flag1列でエラー。boolean列にjson_unquote
しているから。
ERROR 1366 (HY000): Incorrect integer value: 'true' for column 'flag1' at row 1 |
正しい
flag2はjson_unquote
をしていないので成功する。
insert into test1 set id = 1, data = '{"name":"hello", "flag2": true}'; |
select * from test1; |
型は何になっている??
MySQLにはpg_typeof
みたいなものはないので、Selectの結果でTEMPテーブルを作って確認します。
create temporary table tmp1 |
json_unquote
したものはlongtextのようです。
つまり、jsonからtinyintへの変換は成功するが、longtextからtinyintへの変換は失敗するということになります。
確認してみます。
select cast(json_extract('{"name":"hello", "flag1": true}', '$.flag1') as signed) as x; |
対して、
select cast(json_unquote(json_extract('{"name":"hello", "flag1": false}', '$.flag1')) as signed) as x; |
駄目な上に警告がでています。
show warnings; |
検証の単純化
-- OK |
そんなわけで、JSONのbooleanを扱うときは、気をつけましょうということで。