Mysql
為什麼在 MySQL 中使用 JSON_EXTRACT 時 0/false 返回 true
我有一個條件來選擇一個錯誤的 JSON 文件值。
我的行:
1. {"my_value": false} 2. {"my_value": 0} 3. {"my_value": "0"} 4. {"my_value": null} 5. {"my_value": true} // this one got selected
我的查詢:
SELECT * FROM my_table WHERE JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) = false
即使
true
有價值,第 5 行也會被選中。我怎樣才能防止這種情況?版本是 MySQL 8.0.25。
希望你做得很好。
我想查看您的架構以確保一切正常。我試圖重現我相信你所做的事情。
這是我所做的:
mysql> create database test295895; mysql> use test295895; mysql> create table my_table (my_column JSON);
然後我插入了您顯示的值:
mysql> insert into my_table VALUES('{"my_value": false}'); Query OK, 1 row affected (0.01 sec) mysql> insert into my_table VALUES('{"my_value": 0}'); Query OK, 1 row affected (0.02 sec) mysql> insert into my_table VALUES('{"my_value": "0"}'); Query OK, 1 row affected (0.02 sec) mysql> insert into my_table VALUES('{"my_value": null}'); Query OK, 1 row affected (0.02 sec) mysql> insert into my_table VALUES('{"my_value": true}'); Query OK, 1 row affected (0.01 sec) mysql> select * from my_table; +---------------------+ | my_column | +---------------------+ | {"my_value": false} | | {"my_value": 0} | | {"my_value": "0"} | | {"my_value": null} | | {"my_value": true} | +---------------------+ 5 rows in set (0.00 sec)
然後我執行了您的查詢,我看到了所有結果:
mysql> SELECT * FROM my_table -> WHERE JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) = false -> ; +---------------------+ | my_column | +---------------------+ | {"my_value": false} | | {"my_value": 0} | | {"my_value": "0"} | | {"my_value": null} | | {"my_value": true} | +---------------------+ 5 rows in set, 3 warnings (0.00 sec)
我決定看看 JSON_EXTRACT 返回了什麼:
mysql> SELECT JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) from my_table; +-----------------------------------------------------+ | JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) | +-----------------------------------------------------+ | false | | 0 | | 0 | | null | | true | +-----------------------------------------------------+ 5 rows in set (0.00 sec) mysql> SELECT JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) from my_table WHERE JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) = false; +-----------------------------------------------------+ | JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) | +-----------------------------------------------------+ | false | | 0 | | 0 | | null | | true | +-----------------------------------------------------+ 5 rows in set, 3 warnings (0.00 sec)
所以至少在我的情況下,似乎返回的所有內容都作為字元串返回,所以我沒有比較布爾值,而是比較了“假”:
mysql> SELECT JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) from my_table WHERE JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) = 'false'; +-----------------------------------------------------+ | JSON_UNQUOTE(JSON_EXTRACT(my_column, '$.my_value')) | +-----------------------------------------------------+ | false | +-----------------------------------------------------+ 1 row in set (0.00 sec)
它奏效了。所以也許你可以測試一下你是否與’false’ VARCHAR 而不是 Boolean 進行比較它是否有效?
乾杯。