我正在使用 MySQL 8.0(在 Azure Database for MySQL Server 中)。
我在使用“json_extract”功能进行查询时注意到一些奇怪的行为。在下面的示例中,我正在查询包含有效 JSON 文本的 VARCHAR 字段:{"myfield":"123456"}。
SELECT json_extract(jsontext, '$.myfield') raw_extract,
LENGTH(json_extract(jsontext, '$.myfield')) raw_extract_length,
CASE WHEN json_extract(jsontext, '$.myfield') = '123456' THEN 'true' ELSE 'false' END matches_no_quotes,
CASE WHEN json_extract(jsontext, '$.myfield') = '"123456"' THEN 'true' ELSE 'false' END matches_with_quotes,
CASE WHEN json_extract(jsontext, '$.myfield') LIKE '"%"' THEN 'true' ELSE 'false' END matches_wildcard_dbl_quotes
奇怪的是 json_extract 返回的值似乎表现不同,具体取决于与之交互的比较:
- raw_extract ->“123456”
- raw_extract_length -> 8
- matches_no_quotes -> true
- matches_with_quotes -> false
- matches_wildcard_dbl_quotes -> true
正如您所看到的,基本上有两种返回值:一种包含双引号,一种不包含双引号。LENGTH()、立即返回值和 LIKE 运算符的作用就好像双引号存在一样。等式 (=) 的作用并不像引号存在一样。
我最好的理论是,直接返回类型不是 VARCHAR,而是某种 JSON 数据类型,但 MySQL 文档没有确认或否认这一点。作为第一次遇到这种情况的人,这种矛盾的行为非常令人困惑。有人能解释一下吗?