Значение столбца metdata
содержит искаженный JSON как минимум для одной строки в таблице.
Мы ожидаем, что при полном удалении условия a = 'b'
мы также увидим то же самое ошибка.
Я подозреваю, что различие в поведении связано с порядком выполняемых операций. Когда условие a = 'b'
вычисляется первым, это исключает строки до вычисления выражения JSON_EXTRACT(metadata)
. Поскольку строка не соответствует условию a = 'b'
, MySQL использует ярлык, она не оценивает JSON_EXTRACT
, она уже знает, что строка будет исключена.
Когда сравнения выполняются в другом порядке, когда сначала выполняется функция JSON_EXTRACT
, возникает ошибка, когда выражение вычисляется для строк с недопустимым JSON в metadata
.
Сводка:
В таблице есть хотя бы одна строка с неправильным форматом JSON, хранящаяся в столбце metadata
.
Разница в наблюдаемом поведении двух запросов обусловлена разным порядком операций .
Предложение:
Рекомендуется использовать функцию JSON_VALID
для идентификации строк с недопустимыми значениями.
Выдержка из MySQL Справочное руководство
JSON_EXTRACT
Возвращает данные из документа JSON, выбранного из частей документа, соответствующих аргументам пути. Возвращает NULL, если какой-либо аргумент равен NULL или пути отсутствуют, и в документе содержится значение. Ошибка возникает, если аргумент json_do c не является допустимым JSON документом или любой аргумент пути не является допустимым выражением пути.
https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json -экстракт
JSON_VALID
https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json -действительный