Декодирование Типа Данных Json Mysql

В этом посте мы собираемся изучить тип данных JSON в MySQL 5.7 и во время погружения будем использовать платформу Laravel для построения запросов.



Декодирование типа данных JSON MySQL

Для начала создадим новую таблицу:

  
  
  
  
  
  
  
   

CREATE TABLE `products` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` JSON, `specs` JSON, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

И давайте добавим несколько значений:

INSERT INTO products VALUES( null, '{"en": "phone", "it": "telefono"}', '{"colors": ["black", "white", "gold"], "size": {"weight": 1, "height": 1}}' ); INSERT INTO products VALUES( null, '{"en": "screen", "it": "schermo"}', '{"colors": ["black", "silver"], "size": {"weight": 2, "height": 3}}' ); INSERT INTO products VALUES( null, '{"en": "car", "it": "auto"}', '{"colors": ["red", "blue"], "size": {"weight": 40, "height": 34}}' );



Чтение значений JSON

Мы можем прочитать значения столбца JSON, используя простой синтаксис:

select name->"$.

en" as name, specs->"$.

size.weight" as weight, specs->"$.

colors" as colors from products;

Мы получаем следующий результат:

имя масса цвета
'телефон' 1 ['черный', 'белый', 'золотой']
'экран' 2 ['черное серебро']
'машина' 40 ['красно синий']
Как вы могли заметить, результаты получены в виде строки JSON, а это означает, что вам необходимо их декодировать перед отображением на экране.



json_decode( Products::selectRaw('name->"$.

en" as name')->first()->name )



О синтаксисе

Запросы в формате JSON выполняются с помощью оператора " -> ", помещая имя столбца оператора слева и синтаксис пути справа.

Чтобы представить документ в формате JSON, за которым следует селектор, синтаксис PATH использует ведущий $ для указания на определенные части документа.

Вот различные способы получения данных:

  • спецификации-> "$.

    colors" вернет массив цветов

  • спецификации-> "$.

    colors[0]" вернет строку JSON «черная»

  • спецификации-> "$.

    non_existing" вернет НУЛЬ

  • specs-> "$.

    'имя ключа с пробелом'" если ключ содержит пробелы

Если ключ не является действительным идентификатором ECMAScript , он должен быть заключен в кавычки внутри пути.



Использование замен

Вы также можете использовать маску для запроса значений JSON. Допустим, у нас есть следующие данные:

{"name": "phone", "price": 400, "sizes": [3, 4, 5]}

Синтаксис Результат Примечание
характеристики-> "$.

*"

['телефон', [3, 4, 5], [{'имя': 'черный'}, {'имя': 'золотой'}]]
спецификации-> "$.

sizes[*]"

[3, 4, 5] То же, что и $.

sizes

specs-> "$.

colors**.

name"

['черное золото'] Синтаксис «префикс**суффикс» будет запрашивать все пути, начинающиеся с префикса и заканчивающиеся суффиксом.



Запрос значения в формате JSON

Это работает так же, как и с обычными столбцами MySQL. Теперь, когда мы знаем, как написать правильный путь для запроса и/или сортировки значений в формате JSON, давайте рассмотрим несколько примеров:

select name->"$.

en" from products where name->"$.

en" = "phone"; select name->"$.

en" from products where name->"$.

en" IN ("phone"); select specs->"$.

size.weight" from products where specs->"$.

size.weight" BETWEEN 1 AND 10; select * from products ORDER BY name->"$.

en";



Тип данных JSON в среде MySQL и Laravel

Если вы используете фреймворк Laravel версии 5.2.23 или выше, вы сможете свободно использовать построитель запросов для генерации запроса в формате JSON:

Product::where('name->en', 'car')->first(); Product::whereIn('specs->size->weight', [1, 2, 3])->get(); Product::select('name->en')->orderBy('specs->size->height', 'DESC')->get();

Если нет, то вам нужно использовать СЫРОЙ :

Product::whereRaw('name->"$.

en"', 'car')->first();



Заключение

Во многих случаях разработчики предпочитают базу данных NoSQL из-за ее функций, гибкости и/или производительности, однако базы данных SQL являются предпочтительными, и многие крупные компании полагаются на них для разработки продуктивных веб-приложений с использованием комбинации MySQL + (Mongo|Redis|).

и т. д.), но это усложняет стек.

С появлением типа данных JSON в MySQL он стал своего рода гибридной базой данных SQL-NoSQL.

От переводчика

В примерах, где видны «елочки», нужно ставить «кавычки».

Вот как их обрабатывает Хабр.

Теги: #Laravel #laravel 5.2.23 #mysql 5.7 #json #MySQL #Laravel

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.