Тип данных json
С MySQL 5.7.8 MySQL поддерживает родной JSON тип данных определяется В RFC 7159 что обеспечивает эффективный доступ к данным в формате json (JavaScript-объекты Обозначение) документов. Этот JSON тип данных обеспечивает следующие преимущества по сравнению с хранением в формате json-строки в столбец строки:
- Автоматическая проверка json-документов, хранящихся в JSON столбцы. Недействительным документам производить ошибка.
- Оптимизирован Формат хранения. Документы хранятся в формате json, JSONстолбцы преобразуются к внутреннему формат, который позволяет быстрый доступ к элементам документа. Позже, когда сервер должен прочитать значение в json, хранящиеся в этом двоичный Формат, стоимость не должна быть проанализирована с текстом представление. Двоичный Формат таким образом, чтобы включить сервера искать подобъектами или вложенные значения по ключу или индекс массива не читая все значения до или после них в документе.
- Пространство, необходимое для хранения JSON документ приблизительно так же, как LONGBLOB и LONGTEXT; для получения дополнительной информации. Это важно иметь в виду, что размер любого документа json хранить в JSON столбце ограничивается стоимостью из max_allowed_packet системы переменной.
В JSON столбец не может иметь значение по умолчанию.
Наряду с JSON типом данных, набора SQL функции можно включить операции над значениями json, например как создания, манипулирования и поиска. Следующее обсуждение показаны примеры этих операций.
Набор пространственные функции для работы со значениями geojson, который тоже в наличии.
JSON колонки, как колонки другие двоичные типа, не индексируются непосредственно; вместо этого, вы можете создать индекс на генерируемый столбец, который извлекает значение скаляра от JSON колонки.
Оптимизатор MySQL также ищет совместимые указатели на виртуальные столбцы, которые соответствуют выражения json.
Кластер MySQL НБР 7.5 (7.5.2 и выше) поддерживает JSON столбцы и MySQL в json функции, в том числе создание индекса для столбца генерируется из JSON колонки как решение для будучи не в состоянии индекс в JSON столбце. Максимум 3 JSON столбцы в NDB Таблица поддерживается.
Следующие несколько разделов содержат информацию о создание и манипулирование значениями json.
Массив json содержит список значений, разделенных запятыми:
["abc", 10, null, true, false]
Json-объект содержит набор пар ключ-значение, разделенных запятыми и заключены в пределах {}:
{"k1": "value", "k2": 10}
Как примеры иллюстрируют, массивы json и объекты могут содержать скалярные значения, которые являются строками или числами, в json значение NULL литерал или объект json boolean значение True или false литералы. Ключи в Объекты json должны быть строками. Временная (дата, время, или дату и время) скалярные значения тоже допустимы:
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
Вложения допускаются в элементах массива json и json-объект ключевые значения:
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
Можно также получить значения json от ряда функций поставленная MySQL для этой цели , а также методом литья значений других типов в JSON Тип через CAST(value AS JSON). Следующий несколько пунктов описывают, как MySQL обрабатывает json и значения предоставляются в качестве входных данных.
В MySQL, значения json записываются в виде строки. MySQL анализирует любой строкой, используемая в контексте, который требует значение json и выдает ошибку, если он не действителен в json. Эти контексты включить вставить значение в столбец, который имеет JSON тип данных и при передаче аргумента функция, которая ожидает значением json (обычно отображается как json_doc или json_val в документации для Функции json в MySQL), как показано в следующих примерах:
- При попытке вставить значение в JSONколонка выполняется, если значение является допустимым json, но не если это не так:
mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected
mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected
mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
В JSON_TYPE() функции ожидает аргумент json и пытается разобрать его в виде json значение. Она возвращает Тип json значения, если он действует и выдает ошибку, в противном случае:
mysql> SELECT JSON_TYPE('["a", "b", 1]');
Тип данных: ARRAY
mysql> SELECT JSON_TYPE('"hello"');
Тип данных: STRING
mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
MySQL обрабатывает строки, используемые в json контекста с помощью utf8mb4 набор символов и utf8mb4_bin сортировки. Строки в другой наборы символов преобразуются в utf8mb4 качестве надо.
В качестве альтернативы для записи значений json с использованием символьных строк, существуют функции для создания значений json из компонентов элементы. JSON_ARRAY() берет (возможно, пустой) список значений и возвращает массив json с этими значениями:
mysql> SELECT JSON_ARRAY('a', 1, NOW());
["a", 1, "2015-07-27 09:43:47.000000"]
JSON_OBJECT() берет (возможно пустой) список пар ключ-значение и возвращает json-объект содержащих эти пары:
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
| {"key1": 1, "key2": "abc"}
JSON_MERGE() принимает два или больше Документы json и возвращает результат:
mysql> SELECT JSON_MERGE('["a", 1]', '{"key": "value"}');
["a", 1, {"key": "value"}]
Для получения информации о слиянии правила.
Значения json могут быть назначены пользовательские переменные:
mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
{"key": "value"}
Однако, пользовательские переменные не могут быть JSON тип данных, так что хотя @j в предыдущем примере выглядит как json с значение и имеет тот же набор символов и сопоставление в виде json значение, вовсе не имеют JSON тип данных. Вместо этого, в результате JSON_OBJECT() преобразуется в когда строка присваивается переменной.
Строки, созданные путем преобразования значения json есть набор символов Для utf8mb4 и сортировки utf8mb4_bin:
mysql> SELECT CHARSET(@j), COLLATION(@j);
| utf8mb4 | utf8mb4_bin |
Потому что utf8mb4_bin это двоичные параметры сортировки сравнение значения json является чувствительным к регистру.
mysql> SELECT JSON_ARRAY('x') = JSON_ARRAY('X');
Результат : 0
Чувствительность к регистру касается формата json null, true, иfalse литералы, которые всегда должны быть написаны в Нижнем регистре:
mysql> SELECT CAST('null' AS JSON);
| null |
mysql> SELECT CAST('NULL' AS JSON);
ERROR 3141 (22032): Invalid JSON text in argument 1 to function cast_as_json:
"Invalid value." at position 0 in 'NULL'.
Автор Станислав С.