SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = JSON_QUOTE("hello world") y SELECT * FROM mytable WHERE LOWER(metadata->"$.title") = JSON_QUOTE("hello world") funciona, pero no estoy seguro de por qué necesito usar JSON_QUOTE cuando se usa LOWER vs no necesitarlo para una búsqueda exacta.
Si alguien puede explicar por qué, con gusto lo marcaré como la respuesta.