Есть ли ошибка в mysql 5.7 при обработке json типов данных? - PullRequest
1 голос
/ 29 января 2020

Я работаю над проектом laravel, используя mysql. Недавно я обновил свою Ubuntu, и после этого я получаю сообщение об ошибке при получении данных из mysql db с использованием метода json_extract() в предложении where.

До сегодняшнего дня я мог получать данные, используя приведенный ниже код в laravel модель:

return self::where([
            'transaction_details->compensation_status' => Compensation::GIVEN,
            'transaction_type' => self::COMPENSATION,
            'transaction_details->compensation_type' => Compensation::MANUAL
        ])->orderBy('updated_at')->get();

Здесь transaction_details столбец содержит данные json, в то время как transaction_type является целочисленным столбцом.

Таким образом, приведенный выше код при выгрузке дает мне SQL query:

select * from `transactions` where (json_unquote(json_extract(`transaction_details`, '$."compensation_status"')) = 1 and `transaction_type` = 7 and json_unquote(json_extract(`transaction_details`, '$."compensation_type"')) = 2) order by `updated_at` asc

И когда я запускаю этот запрос, я получаю неожиданную ошибку:

# 3141 - Неверный JSON текст в аргументе 1 для функции json_extract: " Отсутствует запятая или '}' после члена объекта. " в позиции 196.

Я также пытался сделать этот запрос короче, сохранив только одно условие, чтобы я мог избавиться от любой ошибки в позиции 196.

select * from `transactions` where json_unquote(json_extract(`transaction_details`, '$."compensation_status"')) = 1 order by `updated_at` asc

Теперь этот запрос в позиции 196 ничего нет, но все та же ошибка.

Я думаю, это ошибка в последних mysql.

Пожалуйста, помогите мне в этом.

РЕДАКТИРОВАТЬ: Это json данных, которые transaction_details содержит

{"message":"fgdfgdfg","referral_compensation_date":"2019-11-30","compensation_status":1,"compensation_type":2,"allocated_count":"-NA-","daily_job_count":"-NA-","allocation_date":"2019-11-30"}

1 Ответ

1 голос
/ 29 января 2020

Ваш запрос полностью правильный и выполняется без проблем с показанными примерами данных на MySQL 5.7.

fiddle

Проблема НЕ в запросе. Проверьте данные, которые вы обрабатываете. Найдите запятую в значении, непечатный символ, специальные символы, ошибочно усеченные значения и т. Д. c.

Попробуйте найти одну проблемную запись c (добавьте условие по диапазону идентификаторов, обработайте половина записей, четверть, ... пока одна запись не вызвала ошибку). Скопируйте эту запись в отдельную таблицу, убедитесь, что она все еще проблемна c, создайте резервную копию этой таблицы и предоставьте общий доступ к сценарию резервного копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...