Estou usando o MySQL 8.0 (dentro do Banco de Dados do Azure para MySQL Server).
Notei um comportamento estranho ao consultar a funcionalidade "json_extract". No exemplo abaixo, estou consultando um campo VARCHAR que contém o texto JSON válido: {"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
O que é estranho é que o valor retornado por json_extract parece se comportar de maneira diferente dependendo de qual comparação está interagindo com ele:
- extração_prima -> "123456"
- raw_extract_length -> 8
- corresponde_no_quotes -> verdadeiro
- corresponde_com_quotes -> falso
- matches_wildcard_dbl_quotes -> verdadeiro
Como você pode ver, há basicamente dois valores de retorno: um com aspas duplas incluídas e outro sem. LENGTH(), o valor de retorno imediato e os operadores LIKE agem como se existissem aspas duplas. A igualdade (=) não funciona como se as aspas existissem.
Minha melhor teoria é que o tipo de retorno direto não é VARCHAR e, em vez disso, é algum tipo de tipo de dados JSON, mas a documentação do MySQL não confirmou ou negou isso. Como alguém que se depara com isso pela primeira vez, esse comportamento contraditório é muito confuso. Alguém pode lançar alguma luz sobre isso?