Официальная ссылка на документ:13.5 The JSON Data Type
MySQL При поддержке RFC 7159 родной, как определено JSON Тип данных, посредством которого можно обеспечить эффективный доступ. JSON(JavaScript Обозначение объекта) данных в документе. с общим JSON Строки формата хранятся в строковых столбцах по сравнению с JSON. Типы данных предоставляют следующие преимущества:
MySQL 8.0 До сих пор используется в Китае JSON_MERGE_PATCH() Поддержка функций RFC 7396 определено в JSON Merge Patch Формат。Посмотреть этофункцияизописывать,а также“JSON Достойная нормализация、слитьи Автоматическая упаковка”,для примеров и дополнительной информации.
Примечание. В этом обсуждении используется монотипный шрифт JSON для представления типа данных JSON, а для представления данных JSON используется обычный шрифт «JSON».
хранилище JSON Место, необходимое для документа, такое же, как и LONGBLOB или LONGTEXT примерно то же самое;Более подробную информацию можно найти в“Раздел 13.7 тип данныххранилище Требовать”。важныйиздапомнить,хранилищесуществовать JSON любой в столбце JSON Размер документа не может превышать max_allowed_packet Значение системной переменной. (Когда сервер работает внутри памяти JSON значение, JSON Значение может быть больше,чем max_allowed_packet значение это ограничение применяется к парам серверов; JSON Достойныйхранилище。)Можетиспользовать JSON_STORAGE_SIZE() функцияполучатьхранилище JSON Обратите внимание на объем места, требуемого для документа; JSON столбец, размер хранилищакосмос и размер этой функции возвращают изценить, дасуществовать до того, как на нем будет выполнено какое-либо частичное обновление Из размера столбцаиспользоватьизхранилище (см. далее в этом разделе) JSON Обсуждение некоторых обновленных оптимизаций).
До MySQL 8.0.13 столбцы JSON не могли иметь значения по умолчанию, отличные от NULL.
удалять JSON Помимо типов данных существует еще набор SQL функция может быть использована для JSON ценить за эксплуатацию,Такие как создать, модификацию ипоиск. Некоторые примеры связанных операций показаны ниже. Подробная информация о каждой отдельной функциииз,Видеть“Раздел 14.17 Функции JSON”。
Также есть группа для GeoJSON ценить за эксплуатациюизкосмосфункция。Видеть“Раздел 14.16.11 космос GeoJSON функция”。
Как и другие столбцы двоичного типа, вы не можете напрямую JSON столбец, но вы можете создать индекс для сгенерированного столбца и использовать этот индекс для JSON в столбцеизвлекатьскалярценить.Подробные примеры,Видеть“индексгенерироватьстолбец для предоставления JSON индекс столбца”。
Оптимизатор MySQL также ищет совместимые индексы для виртуальных столбцов, соответствующих выражению JSON.
существовать MySQL 8.0.17 и более поздние версии, InnoDB хранилищедвигательподдерживать JSON множествоначальствоиз Множественный индекс цен。Видеть“Множественный индекс цен”。
MySQL NDB Cluster 8.0 поддерживать JSON сумма столбца MySQL JSON функция,включатьсуществовать JSON Создание индекса для сгенерированного столбца столбца, чего нельзя сделать для JSON Решение для создания индексов непосредственно по столбцам. каждый NDB поверхностьбольшинствоподдерживать 3 индивидуальный JSON Список.
В существующем MySQL 8.0 оптимизатор может частично обновлять столбцы JSON вместо удаления старых документов и последующей записи всех новых документов в Список. Эту оптимизацию можно выполнить для обновлений, соответствующих следующим условиям:
добавив binlog_row_value_options Системные переменные установлены на PARTIAL_JSON,может быть Это частичное обновление позволяет сохранить запись двоичного журнала в компактном формате.
различатьхранилищесуществоватьповерхностьсерединаиз JSON Важно записывать в двоичный журнал частичные обновления значений столбцов вместе с частичным обновлением строк. верно JSON Полные обновления столбцов могут регистрироваться как частичные обновления в двоичном журнале. Это может произойти, если не соблюдены два последних индивидуальных условия в предыдущем списке, но соблюдены остальные условия. См. также binlog_row_value_options описание.
В следующих разделах представлена основная информация о создании значений JSON и манипулировании ими.
JSON множество содержит индивидуальный Достойный столбец поверхности, разделенный запятыми и разделенный [ и ] Вложенные персонажи:
["abc", 10, null, true, false]
JSON Объект содержит набор пар ключ-значение, разделенных запятыми и { и } Вложенные персонажи:
{"k1": "value", "k2": 10}
Как показано в примере, JSON Многие объекты могут содержать скалярценить строки или числа, JSON. null Текст или JSON Логическое значение true или false текст. JSON Ключ в объекте должен быть строкой. Также разрешено использовать времена (date, time или datetime) скалярценить:
["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]}
Также доступен из MySQL Получено из множества функций, предусмотренных для этого JSON ценить(Видеть“Раздел 14.17.2 создаватьJSONДостойныйфункция”),также Можеткиспользовать CAST(value AS JSON) Приведите значения других типов к JSON тип(Видеть“JSON ценитьи нет JSON Преобразование между ценить Из и из”)。Следующийизнесколько абзацевописывать MySQL Как справиться с JSON ценить.
существовать MySQL в формате JSON Значения записываются в виде строк. MySQL Любая необходимость использования в контексте синтаксического анализа JSON строка значений, если строка имеет вид JSON Если он недействителен, будет сгенерирована ошибка. Эти контексты включают вставку значений в объекты с помощью JSON тип столбец данных или передать ожидаемые параметры JSON Достойныйфункция(существовать MySQL JSON Документация по функциям обычно выглядит как JSON_doc или JSON_val), как показано в следующем примере:
Вставка значения в столбец JSON выполняется успешно, если значение является допустимым значением JSON, и не выполняется в противном случае:
mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)
mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)
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,'.
Позиция «в позиции N» в таких сообщениях об ошибках отсчитывается от 0, но ее следует рассматривать как грубое указание на то, в каком месте значения действительно возникает проблема.
JSON_TYPE() функциянужен одининдивидуальный JSON параметр и попробуйте проанализировать его как JSON ценить.еслиценитьэффективный,затем вернись Достойный JSON введите, иначе возникает ошибка:
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY |
+----------------------------+
mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| 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 использовать utf8mb4 набор символов и utf8mb4_bin Обработка сортировки JSON использовать строку в контексте. из строк в других наборах символов будут преобразованы в utf8mb4。(ascii или utf8mb3 Строки в наборе символов преобразовывать не нужно, поскольку ascii и utf8mb3 да utf8mb4 подмножество. )
Записанный текст строки asuse JSON Альтернативы значениям,в том числе для составления из составных элементов JSON функция стоимости. JSON_ARRAY() получатьодининдивидуальный(Можетспособныйдлянулевой)Достойный Списокповерхность,и возвращает индивидуальное сообщение, содержащее следующие Достойный JSON:
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| 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');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
JSON_MERGE_PRESERVE() получатьдваиндивидуальныйилимногоиндивидуальный JSON документируйте и возвращайте объединенный результат:
mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}] |
+-----------------------------------------------------+
1 row in set (0.00 sec)
Информация о правилах и положениях о слияниях,Видеть“JSON Достойный Стандартизировать、слитьи Автоматическая упаковка”。(MySQL 8.0.3 и более поздние версии также поддерживают JSON_MERGE_PATCH(),У него другое поведение. Информация о различиях между этими двумя индивидуальными функциями Из,Видеть“JSON_MERGE_PATCH() и JSON_MERGE_PRESERVE() из сравнения”。)
Значения JSON можно присваивать пользовательским переменным:
mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j |
+------------------+
| {"key": "value"} |
+------------------+
Однако пользовательские переменные не могут быть JSON тип данных, поэтому, хотя в предыдущем примере @j выглядит как JSON ценить и иметь JSON ценитьтакой жеизнабор символов Правила сортировки,но у него нет JSON Тип данных. JSON_ОБЪЕКТ() Результат существования преобразуется в строку при присвоении переменной.
Строка, сгенерированная путем преобразования значения JSON, имеет набор символов utf8mb4 и параметры сортировки utf8mb4_bin:
mysql> SELECT CHARSET(@j), COLLATION(@j);
+-------------+---------------+
| CHARSET(@j) | COLLATION(@j) |
+-------------+---------------+
| utf8mb4 | utf8mb4_bin |
+-------------+---------------+
потому что utf8mb4_bin двоичная сортировка, поэтому JSON Сравнение значений чувствительно к регистру.
mysql> SELECT JSON_ARRAY('x') = JSON_ARRAY('X');
+-----------------------------------+
| JSON_ARRAY('x') = JSON_ARRAY('X') |
+-----------------------------------+
| 0 |
+-----------------------------------+
Чувствительность к регистру также применяется к JSON null、true и false Текст, который всегда должен быть в нижнем регистре:
mysql> SELECT JSON_VALID('null'), JSON_VALID('Null'), JSON_VALID('NULL');
+--------------------+--------------------+--------------------+
| JSON_VALID('null') | JSON_VALID('Null') | JSON_VALID('NULL') |
+--------------------+--------------------+--------------------+
| 1 | 0 | 0 |
+--------------------+--------------------+--------------------+
mysql> SELECT CAST('null' AS JSON);
+----------------------+
| CAST('null' AS JSON) |
+----------------------+
| null |
+----------------------+
1 row in set (0.00 sec)
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'.
JSON Чувствительность к регистру текста отличается от SQL NULL、TRUE и FALSE Текст, который может быть в любом случае:
mysql> SELECT ISNULL(null), ISNULL(Null), ISNULL(NULL);
+--------------+--------------+--------------+
| ISNULL(null) | ISNULL(Null) | ISNULL(NULL) |
+--------------+--------------+--------------+
| 1 | 1 | 1 |
+--------------+--------------+--------------+
иногдасуществовать JSON Вставьте символы кавычек (" или ') Может быть, нужно или надеюсь. Предположим, в этом примере вы хотите преобразовать некоторые JSON вставка объектаиспользоватьниже SQL операторов, эти объекты содержат строки, представляющие предложения, в которых говорится MySQL В некоторых случаях каждая отдельная строка имеет соответствующие пары ключевых слов:
mysql> CREATE TABLE facts (sentence JSON);
Среди этих пар ключевое слово-предложение есть такая пара:
mascot: The MySQL mascot is a dolphin named "Sakila".
относиться к этому как JSON вставка объекта facts поверхностьизметоддаиспользовать MySQL JSON_object() Функция. существуют В этом случае,Необходимо использовать обратную косую черту для экранирования каждого отдельного символа кавычки.,Как показано ниже:
mysql> INSERT INTO facts VALUES
> (JSON_OBJECT("mascot", "Our mascot is a dolphin named \"Sakila\"."));
Если вы хотите, чтобы значение было JSON Вставка текста объекта,Это письмо не будет работать таким же образом. В этом случае вам необходимо экранировать его двойной обратной косой чертой.,Как показано ниже:
mysql> INSERT INTO facts VALUES
> ('{"mascot": "Our mascot is a dolphin named \\"Sakila\\"."}');
использовать двойную обратную косую черту, чтобы предотвратить MySQL Выполняет обработку escape-последовательности и передает строковый литерал механизму хранилища для обработки. Вставьте любым из только что показанных способов. JSON объект, выполнив простой SELECT можно увидеть JSON Списокценитьсерединажитьсуществоватьобратная косая черта,Как показано ниже:
mysql> SELECT sentence FROM facts;
+---------------------------------------------------------+
| sentence |
+---------------------------------------------------------+
| {"mascot": "Our mascot is a dolphin named \"Sakila\"."} |
+---------------------------------------------------------+
Чтобы найти этого человека с mascot дляключевое слово конкретное предложение, можно использовать столбец - оператор пути ->,Как показано ниже:
mysql> SELECT col->"$.mascot" FROM qtest;
+---------------------------------------------+
| col->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)
Это сохранит обратные косые черты, а также кавычки рядом с ними. Спользовать mascot Отображает требуемую цену в качестве ключа, но не включает escape-символы рядом с кавычками, используйте встроенные операторы пути. ->>,Как показано ниже:
mysql> SELECT sentence->>"$.mascot" FROM facts;
+-----------------------------------------+
| sentence->>"$.mascot" |
+-----------------------------------------+
| Our mascot is a dolphin named "Sakila". |
+-----------------------------------------+
Описание: Если включено NO_BACKSLASH_ESCAPES сервер SQL режиме предыдущий пример не будет работать должным образом. Если этот режим установлен, вы можете вставить использовать с одной обратной косой чертой вместо двойной обратной косой черты. JSON Текст объекта с сохранением обратной косой черты. еслисуществовать выполнить вставкуиспользовать JSON_OBJECT() функция,и установите этот режим,Вы должны чередовать использование одинарных и двойных кавычек.,Как показано ниже:
mysql> INSERT INTO facts VALUES
> (JSON_OBJECT('mascot', 'Our mascot is a dolphin named "Sakila".'));
Дополнительные сведения о влиянии этого режима на экранированные символы в значениях JSON см. в описании функции JSON_UNQUOTE().
Когда отдельная строка анализируется и обнаруживается, что индивидуальная строка действительна из JSON При документировании оно также будет нормализовано. Это означает, что при чтении ключей слева направо обнаруживаются дубликаты ключей членов, найденных в документе, которые существуют и позади них. следующее JSON_object() Вызов ограниченностииз объекта ценить включает в себя только второго человека. key1 элемент,потому что дубликат ключа ценить соответствует из, за которым следует один индивидуальный ценить.,Как показано ниже:
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def');
+------------------------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def') |
+------------------------------------------------------+
| {"key1": "def", "key2": "abc"} |
+------------------------------------------------------+
Нормализация также выполняется при вставке значений в столбцы JSON следующим образом:
mysql> CREATE TABLE t1 (c1 JSON);
mysql> INSERT INTO t1 VALUES
> ('{"x": 17, "x": "red"}'),
> ('{"x": 17, "x": "red", "x": [3, 5, 7]}');
mysql> SELECT c1 FROM t1;
+------------------+
| c1 |
+------------------+
| {"x": "red"} |
| {"x": [3, 5, 7]} |
+------------------+
Этот «последний индивидуальный повторный ключ побеждает» из поведения RFC 7159 рекомендуется, и большинством JavaScript Реализация парсера. (Ошибка #86866, Bug #26369555)
существовать 8.0.3 предыдущий MySQL Версии, в которых ранее в документе обнаружен дубликат ключа или элемента, будут отброшены. следующее JSON_object() вызовгенерироватьизобъектценить Нетвключатьвторойиндивидуальный key1 элемент,потому что дубликат ключа ценить соответствует из, за которым следует один индивидуальный ценить.:
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def');
+------------------------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def') |
+------------------------------------------------------+
| {"key1": 1, "key2": "abc"} |
+------------------------------------------------------+
существовали до MySQL 8.0.3. Эта нормализация «первого индивидуального дубликата ключа» также выполнялась при вставке ценить в существующий столбец JSON.
mysql> CREATE TABLE t1 (c1 JSON);
mysql> INSERT INTO t1 VALUES
> ('{"x": 17, "x": "red"}'),
> ('{"x": 17, "x": "red", "x": [3, 5, 7]}');
mysql> SELECT c1 FROM t1;
+-----------+
| c1 |
+-----------+
| {"x": 17} |
| {"x": 17} |
+-----------+
MySQL Также удаляет оригинал JSON Лишние пробелы между ключами ценили элементы в документе и существовали при отображении. Запятая (,) или двоеточие (:) оставьте (или существует, вставьте при необходимости) отдельный пробел. Это сделано для повышения читабельности.
генерировать JSON Достойный MySQL функция(Видеть“Раздел 14.17.2 создавать JSON Достойныйфункция”)общийдавозвращаться Стандартизироватьизценить.
Чтобы повысить эффективность поиска, MySQL Ты все равно будешь прав? JSON объектиз Сортировать по ключу。должен знать,Результаты сортировки могут быть изменены.,И нет никакой гарантии, что существование будет одинаковым для разных версий.
MySQL 8.0.3 (и более поздние версии) поддерживают два алгоритма слияния по функциям JSON_MERGE_PRESERVE() и JSON_MERGE_PATCH() выполнить. Они обрабатывают повторяющиеся ключи по-разному: JSON_MERGE_PRESERVE(). сохранять значения для повторяющихся ключей, тогда как JSON_MERGE_PATCH() Отмените все ценить, кроме последней индивидуальной цены. Следующие несколько абзацев объясняют, как работать с этими двумя индивидуальными функциями. JSON Документы (т.е. объекты и множество) из разных комбинаций объединяются.
Описание: JSON_MERGE_PRESERVE(). Предыдущая версияиз MySQL(существовать MySQL 8.0.3 переименован) в JSON_MERGE() функциятакой же。существовать MySQL 8.0 в формате JSON_MERGE() все еще как JSON_MERGE_PRESERVE() изодининдивидуальныйпсевдоним этоподдерживать,Но использовать больше не рекомендуется,И существующие будут удалены в будущих версиях.
Объединение массивов
Существующее сочетание множества индивидуальных множествоиз контекста было слито в одно индивидуальное множество. JSON_MERGE_PRESERVE() Это достигается за счет подключения количества после множества к концу прибытия перед одним индивидуальным множествоиз. JSON_MERGE_PATCH() Рассматривайте каждый индивидуальный параметр как индивидуальный, состоящий из одного индивидуального элемента из множества (так что его индекс равен 0), а затем применить логику «выигрыш последнего повторенного ключа», чтобы выбрать только последний индивидуальный параметр. Этот запрос можно сравнить, показав результаты:
mysql> SELECT
-> JSON_MERGE_PRESERVE('[1, 2]', '["a", "b", "c"]', '[true, false]') AS Preserve,
-> JSON_MERGE_PATCH('[1, 2]', '["a", "b", "c"]', '[true, false]') AS Patch\G
*************************** 1. row ***************************
Preserve: [1, 2, "a", "b", "c", true, false]
Patch: [true, false]
Объединение объектов
слитьмногоиндивидуальныйобъектвстречагенерироватьодининдивидуальныйобъект。JSON_MERGE_PRESERVE() добавление имеет один и тот же ключ для всех уникальных цен, комбинация приезжает индивидуальное множество, чтобы иметь дело с Несколько отдельных объектов; множество впоследствии используется в качестве ключа в результате оценить.JSON_MERGE_PATCH() Отменить поездку слева направо, чтобы найти повторяющиеся ключи, чтобы результат содержал только последнюю индивидуальную цену этого ключа. Следующий запрос иллюстрирует повторяющиеся ключи. a Разница в результатах:
mysql> SELECT
-> JSON_MERGE_PRESERVE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}', '{"c": 5, "d": 3}') AS Preserve,
-> JSON_MERGE_PATCH('{"a": 3, "b": 2}', '{"c": 3, "a": 4}', '{"c": 5, "d": 3}') AS Patch\G
*************************** 1. row ***************************
Preserve: {"a": [1, 4], "b": 2, "c": [3, 5], "d": 3}
Patch: {"a": 4, "b": 2, "c": 5, "d": 3}
существоватьнуждатьсямножество Достойныйначальствонижесерединаиспользоватьиз Нетмножествоценитьда Автоматическая упаковкаиз:Долженценить Зависит от [ и ] символов, чтобы преобразовать его во множество. В следующем из утверждении каждый отдельный параметр является автоматическим. упаковкадляодининдивидуальныймножество([1], [2]). Эти результаты затем объединяются в один результат индивидуального числа и То же, что и в первых двух случаях, JSON_MERGE_PRESERVE(); объединяет значения с одним и тем же ключом, тогда как JSON_MERGE_PATCH() выброситьудалятьнаконецодининдивидуальныйключ Изснаружиизвсеповторитьключизценить,Как показано ниже:
mysql> SELECT
-> JSON_MERGE_PRESERVE('1', '2') AS Preserve,
-> JSON_MERGE_PATCH('1', '2') AS Patch\G
*************************** 1. row ***************************
Preserve: [1, 2]
Patch: 2
множествоиобъектизценитьдадобавивобъект Автоматическая упаковка имеет множество значений и объединяется путем объединения множества цен, или объединяется «выигрывает последний индивидуальный дубликат ключа», в соответствии с выбором функции слияния (соответственно соответствующему JSON_MERGE_PRESERVE() или JSON_MERGE_PATCH()), как показано в этом примере:
mysql> SELECT
-> JSON_MERGE_PRESERVE('[10, 20]', '{"a": "x", "b": "y"}') AS Preserve,
-> JSON_MERGE_PATCH('[10, 20]', '{"a": "x", "b": "y"}') AS Patch\G
*************************** 1. row ***************************
Preserve: [10, 20, {"a": "x", "b": "y"}]
Patch: {"a": "x", "b": "y"}
JSON Выражения пути используются в запросах JSON Выражение поверхности изценить.path в документе используется для извлечения детали. JSON Исполнение или модификация документа JSON Функции документа очень полезны для указания местоположения операций в документе. Например, следующий запрос начинается с JSON Извлеченный документ имеет name Значение члена ключа:
mysql> SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');
+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan" |
+---------------------------------------------------------+
синтаксис путииспользовать предисловие $ символы, обозначающие рассматриваемый документ JSON, за которыми необязательно следуют селекторы, которые, в свою очередь, указывают на более конкретные части документа:
Точка, за которой следует индивидуальное имя ключа.,Используется для извлечения члена с заданным именем ключа в объекте. если без кавычек из существует имя, путь к поверхности недопустим в выражении (например,,если содержит пробелы),Имя ключа должно быть указано в двойных кавычках.
[N] После добавления к пути массива выбора извлеките позицию в массиве N Местоположение изценить.множество позиции да начинается с нуля из целого числа. если путь не выбран многоценить, то path[0] из Результаты расчетов path такой же:
mysql> SELECT JSON_SET('"x"', '$[0]', 'a');
+------------------------------+
| JSON_SET('"x"', '$[0]', 'a') |
+------------------------------+
| "a" |
+------------------------------+
1 row in set (0.00 sec)
[M приезжать N] Укажите множество Достойного подмножества или диапазона, начиная с позиции M Начать с ценить, должность приезжать N Значение заканчивается на. последний Используется поддержкой как синоним крайнего правого индекса множества элементов. Также поддерживается множество элементов относительного адреса. если path Если значение массива не выбрано, то path[last] из Результаты расчетов path изценитьтакой же,Как показано далее в этом разделе(Видеть“Крайний правый элемент измножество”)。
Путь может содержать * или ** Подстановочный знак: .[*] Оценивать JSON Значения всех членов объекта [*] Оценивать JSON множествосерединавсеэлементизценить.prefix**suffix Оценивать Все начинается с префикса имени、заканчиваться суффиксом имениизпуть。
документсередина Не существуетсуществоватьизпуть(Результат для Оценивать:Не существуетсуществоватьизданные)вычислитьрезультатдля NULL。
Рассмотрите возможность использования $ Цитата ниже этого человека имеет три индивидуальных элемента: JSON Множество:
[3, {"a": [5, 6], "b": 10}, [99, 100]]
Так:
потому что [1] и [2] из Оцениватьрезультатда Нетскалярценить,Таким образом, их можно использовать в качестве основы для выбора вложенных более конкретных путей выражений поверхности. Пример:
Как упоминалось ранее, выражение if unquoted from key name существует поверхность пути недопустимо, поэтому именованный компонент key out path должен быть заключен в кавычки. позволять $ поверхность Показать этоиндивидуальныйценить:
{"a fish": "shark", "a bird": "sparrow"}
Все ключи содержат пробелы и должны быть заключены в двойные кавычки:
использоватьподстановочный знакизпутьвычислить得出измножество Можетспособный包含многоиндивидуальныйценить:
mysql> SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.*');
+---------------------------------------------------------+
| JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.*') |
+---------------------------------------------------------+
| [1, 2, [3, 4, 5]] |
+---------------------------------------------------------+
mysql> SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.c[*]');
+------------------------------------------------------------+
| JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.c[*]') |
+------------------------------------------------------------+
| [3, 4, 5] |
+------------------------------------------------------------+
существуют В следующем примере путь **.b Результат для Оценивать:многоиндивидуальныйпуть(.a.b и
mysql> SELECT JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}', '$**.b');
+---------------------------------------------------------+
| JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}', '$**.b') |
+---------------------------------------------------------+
| [1, 2] |
+---------------------------------------------------------+
Можно использовать с to ключевое слово range указать JSON Подмножество массива. Например, $[1 to 3] включатьмножествоизвторой、третийичетвертыйиндивидуальныйэлемент,Как показано ниже:
mysql> SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');
+----------------------------------------------+
| JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]') |
+----------------------------------------------+
| [2, 3, 4] |
+----------------------------------------------+
1 row in set (0.00 sec)
Грамматика да M приезжать Н, среди которых M и N Соответственно JSON множество элементов в серии: от первого индивидуального до последнего индивидуального индекса. Н должно быть больше, чем M;M должно быть больше, чемили равно 0. множество элементов с индексом 0 начало。Можетксуществоватьподдерживатьподстановочный использовать область видимости контекста.
поддерживатьиспользовать last Ключевое слово используется как синоним нижнего индекса последнего индивидуального элемента в множестве. последний-N формаизповерхностьвыражение Можетиспользуется дляотносительный адреси Определение области действия,Как показано ниже:
mysql> SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[last-3 to last-1]');
+--------------------------------------------------------+
| JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[last-3 to last-1]') |
+--------------------------------------------------------+
| [2, 3, 4] |
+--------------------------------------------------------+
1 row in set (0.01 sec)
еслииспользуется для Оценивать Достойныйпуть Нетдамножество,но Оцениватьрезультати Воля Долженценить Инкапсуляциясуществоватьодининдивидуальныйэлементмножествосерединачасизрезультаттакой же:
mysql> SELECT JSON_REPLACE('"Sakila"', '$[last]', 10);
+-----------------------------------------+
| JSON_REPLACE('"Sakila"', '$[last]', 10) |
+-----------------------------------------+
| 10 |
+-----------------------------------------+
1 row in set (0.00 sec)
может быть column->path,вместе с JSON Идентификатор столбца и JSON вместе с выражениями пути, используемыми как JSON_EXTRACT(column, path) изсинонимы。связанный Дажемногоинформация,Видеть“Раздел 14.17.3 поиск JSON Достойныйфункция”。Другой Может Видеть“индексгенерироватьстолбец для предоставления JSON индекс столбца”。
некоторыйфункцияиспользоватьсуществующийиз JSON document, каким-либо образом измените его и верните измененный документ. Выражение поверхности пути указывает расположение изменений, внесенных в существующий документ. Например, JSON_SET(), JSON_INSERT(). и JSON_REPLACE() функциясоответственноиспользоватьодининдивидуальный JSON документ, плюс пара путей ценить, описывающих место изменения документа. Эта функция обрабатывает существующие документы по-разному.
Рассмотрим следующий индивидуальный документ:
mysql> SET @j = '["a", {"b": [true, false]}, [10, 20]]';
JSON_SET() заменит существующий путь «изценить» и добавит «ценить» для отсутствующего пути «существовать»:
mysql> SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+--------------------------------------------+
| JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+--------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20, 2]] |
+--------------------------------------------+
существуют В этом случае путь [1].b[0] При выборе отдельного существующего ценить(true) ценить будет заменен параметром пути, следующим за изценить(1). путь [2][2] существующего не существует, поэтому соответствующее изценить (2) добавляется надписью приезжать
JSON_INSERT() добавляет новые значения, но не заменяет существующие значения:
mysql> SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+-----------------------------------------------+
| JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+-----------------------------------------------+
| ["a", {"b": [true, false]}, [10, 20, 2]] |
+-----------------------------------------------+
JSON_REPLACE() заменит существующие значения и проигнорирует новые значения:
mysql> SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+------------------------------------------------+
| JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+------------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20]] |
+------------------------------------------------+
path-value Чтобы да слева приезжать направо Оценивать. При Оценивании пары удешевление документ станет Оценивать следующую пару по новой цене.
JSON_REMOVE() Получает документ JSON и указывает путь для удаления из документа. Возвращает исходный документ минус путь, выбранный в документе:
mysql> SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');
+---------------------------------------------------+
| JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]') |
+---------------------------------------------------+
| ["a", {"b": [true]}] |
+---------------------------------------------------+
Операции с путями имеют следующие эффекты:
MySQL существовать и существовать, описанные в других разделах данного руководства, из многих JSON функция(Видеть“Раздел 14.17 JSONфункция”),нужен одининдивидуальныйпутьповерхностьвыражение来识别 JSON из Конкретные элементы в документе. Путь состоит из пути из диапазона и одной индивидуальной или нескольких индивидуальных ветвей пути. для MySQL JSON Путь использования функции, область действия всегда дана для поиска или иного манипулирования документом, которому предшествует $ представление персонажа. Ветви пути разделяются символами точки (.). Ячейки массива представлены [N] средства, среди которых N неотрицательное целое число. Имя ключа должно быть строкой в двойных кавычках, чтобы быть действительным. ECMAScript идентификатор (см. ECMAScript спецификация языкасерединаиз“имя идентификатора и идентификатор”)。и JSON Как и текст, выражение поверхности пути следует использовать. ascii、utf8mb3 или utf8mb4 набор символов для кодирования. Другие кодировки символов неявно принуждаются к utf8mb4. Полный синтаксис выглядит следующим образом:
pathExpression:
scope[(pathLeg)*]
pathLeg:
member | arrayLocation | doubleAsterisk
member:
period ( keyName | asterisk )
arrayLocation:
leftBracket ( nonNegativeInteger | asterisk ) rightBracket
keyName:
ESIdentifier | doubleQuotedString
doubleAsterisk:
'**'
period:
'.'
asterisk:
'*'
leftBracket:
'['
rightBracket:
']'
как упоминалось ранее,существовать MySQL , путь в области видимости всегда да для работы из документа, поверхность отображается как 。Можетксуществовать JSON путьповерхностьвыражениесерединаиспользовать “” Как синоним документа.
Описание: Некоторые реализации утверждения JSON ссылка на столбец в области пути,но MySQL 8.0 Нетподдерживать。
подстановочный знак * и ** отметкаизиспользовать Вот как:
Кроме того, путь не может содержать *** последовательность Список.
Примеры синтаксиса пути см. в разделе «Различные». JSON Описание функции, например JSON_CONTAINS_PATH()、JSON_SET() и JSON_REPLACE()。связанныйиспользовать * и ** подстановочный Примеры знаков см. JSON_SEARCH() функцияописание.
MySQL 8.0 возвращатьсяподдерживатьиспользовать to Ключевые слова (например, $[2 to 10]) как JSON диапазонное представление подмножества массива и last закрыватьключкаллиграфиядлямножествосамый правыйэлементизсинонимы。связанный Дажемногоинформацияи Показыватьпример,Видеть“поиски Исправлять JSON ценить”。
JSON ценить Можеткиспользовать =、<、<=、>、>=、<>、!= и <=> оператор сравнения. JSON ценить пока не поддерживаются следующие операторы сравнения функции:
использовать Здесь перечислены операторы сравнения, если функции являются индивидуальными решениями. JSON Значение преобразуется в MySQL родной из числового или строкового типа данные, чтобы сделать их последовательными и непротиворечивыми. JSON Скалярный тип.
JSON Достойный разделен на два индивидуальных уровня. Сравнение первого уровня основано на сравниваемом Достойном JSON тип.Если типы разные, результат сравнения зависит только от того, какой тип имеет более высокий приоритет. если эти два индивидуума имеют одинаковую цену JSON Введите, затем используйте правила, специфичные для типа, для выполнения сравнения второго уровня.
В следующем списке показаны JSON Типы имеют приоритет от высокого уровня проживания до низкого уровня. (Имя типа да задано JSON_TYPE() Функция возвращает имя. ) существуют, показаны вместе в одной строке из типов с одинаковым приоритетом. Поверхность колонны, указанная ранее, имеет JSON Любое значение типа имеет большее JSON Любое значение типа больше.
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
Для тех, у кого такой же приоритет JSON ценить,Сравнительные правиланодаспецифичный длятипиз:
BLOB:сравнить дваиндивидуальный Достойныйвперед N индивидуальныйбайт,Чтосередина N дакорочеценитьсерединаизбайтчисло。еслидваиндивидуальный Достойныйвперед N отдельные байты одинаковы, то более короткое изценить будет организовано раньше более длинного изценить Из.
BIT:и BLOB Правила те же.
OPAQUE:и BLOB Правила те же.OPAQUE ценитьда не классифицируется как Другие типыизценить.
DATETIME: поверхность указывает на более ранний момент времени, а зценить существование строки поверхности указывает на более поздний момент времени из числа ценить Из назад. если и индивидуальноценить соответственно родом из MySQL DATETIME и TIMESTAMP тип,Тогда, если их поверхности представляют один и тот же момент времени,Тогда они да равны из.
TIME:дваиндивидуальныйвремяценитьсерединаменьшеизодининдивидуальный Нажиматьпоследовательность Рядсуществовать Большеизодининдивидуальный Извперед。
ДАТА: Более ранняя дата ранжируется перед самой поздней датой.
ARRAY:еслидваиндивидуальный JSON «множество» имеет одинаковую длину, а соответствующие позиции изценить в «множестве» равны, тогда они равны. если множество не равно, то их порядок определяется элементом из в первой индивидуальной позиции хранимой разницы существования. Локация находится перед меньшим ценить из множества существующих рядов. если более короткие числа из всех ценить равны более длинным числам из соответствующих цен, то более короткие числа стоят перед существованием. Например:
[] < ["a"] < ["ab"] < ["ab", "cd", "ef"] < ["ab", "ef"]
BOOLEAN: ложный текст JSON меньше истинного текста JSON.
OBJECT:еслидваиндивидуальный JSON Объекты имеют одинаковый набор ключей, и если каждый ключ в двух объектах имеет один и тот же ключ, то они равны. Например:
{"a": 1, "b": 2} = {"b": 2, "a": 1}
Два индивидуума не равны из объектов, порядок да не указан, но является детерминированным.
STRING: сравниваются две отдельные строки utf8mb4 Выраженный ранее N отдельные байты сортируются лексически, где N да короче строка по длине. если дваиндивидуальная строка в изпрежде N Байты одинаковы, более короткая строка считается меньшей, чем более длинная. Например:
"a" < "ab" < "b" < "bc"
Эта сортировка эквивалентна правилу сортировки utf8mb4_bin из SQL Строка сортировки. потому что что utf8mb 4_bin двоичная сортировка, поэтому JSON Достойное сравнение чувствительно к регистру:
"A" < "a"
INTEGER, DOUBLE: JSON ценить может содержать точные числа и приблизительные числа. Общее обсуждение этих числовых типов.,Видеть“Раздел 11.1.2 Цифровой текст”。“Раздел 14.3. Выражение поверхности Оцениватьсерединаиз Преобразование типов”Обсуждается относительно родной MySQL Числовые типы из правил, но сравнение JSON Правила ценообразования несколько иные:
существуют соответственно использование собственного числового типа MySQL INT и DOUBLE из двух столбцов между сравнением.,Известно, что все сравнения включают индивидуальное целое число и индивидуальное двойное число.,Таким образом, все строки целых чисел преобразуются в двойные. То есть, да,Точные значения цен преобразуются в приблизительные значения цен.
С другой стороны, запрос if сравнивает два человека, которые содержат цифры из JSON столбцы, невозможно заранее узнать число целое или двойное. Чтобы обеспечить наиболее согласованное поведение во всех строках, MySQL будет приближаться к значению преобразуется Получите точную оценку. Получите последовательную сортировку без потери точности числовых оценок. Например, данный скаляр 9223372036854775805、9223372036854775806、9223372036854775807 и 9.223372036854776e18, в следующем порядке:
9223372036854775805 < 9223372036854775806 < 9223372036854775807 < 9.223372036854776e18 = 9223372036854776000 < 9223372036854776001
если JSON Сравниватьиспользовать Нет JSON Если существуют правила численного сравнения, могут возникнуть несоответствия в сортировке. MySQL Обычно правила числового сравнения создают следующий порядок:
Целочисленное сравнение
9223372036854775805 < 9223372036854775806 < 9223372036854775807
(9.223372036854776e18 не определено)
Сравнение чисел двойной точности
9223372036854775805 = 9223372036854775806 = 9223372036854775807 = 9.223372036854776e18
для любого JSON ценитьи SQL NULL изCompare, результаты все да НЕИЗВЕСТНЫЙ. для сравнения JSON и нет JSON ценить, по правилам под поверхность не будет JSON Значение преобразуется в JSON, а затем сравните, как описано ранее.
В таблице ниже показаны правила, которым мы следуем при преобразовании значений MySQL и JSON.
Таблица 13.3 Правила преобразования JSON
Другие типы | CAST(other type AS JSON) | CAST(JSON AS other type) |
---|---|---|
JSON | постоянный | постоянный |
Тип символов uft8 (utf8mb4, utf8mb3, ascii) | Строка анализируется как JSONценить. | JSONценить сериализуется в индивидуальную строку utf8mb4. |
Другие типы персонажей | Другие кодировки символов неявно преобразуются в utf8mb4 и обрабатываются, как описано для этого типа символов. | Значения JSON сериализуются в строки utf8mb4, а затем преобразуются в другие кодировки символов. Результаты могут не иметь смысла. |
NULL | Результат даJSON типа изNULLценить. | непригодный. |
тип географии | Преобразование географического значения преобразуется в документ JSON путем вызова ST_AsGeoJSON(). | Незаконная операция. Решение: измените CAST(json_val AS CHAR)из Результат передается в ST_GeomFromGeoJSON(). |
Все Другие типы | Результатом является документ JSON, состоящий из одного индивидуальногоскалярценить. | если документ JSON состоит из целевого типа индивидуальныйскалярценить,И скалярценить можно применить к целевому типу.,тогда успех. в противном случае,Возвращает NULL и выдает предупреждение. |
JSON Достойный ORDER BY и GROUP BY Работайте по следующим принципам:
Для сортировки используйте JSON Скаляр приведен к какому-то другому нативу MySQL Тип может быть выгодным из. Например, если называется jdoc из столбца содержит JSON Объект, члены которого представлены id ключи нетгрузценитькомпозиция,ноиспользоватьэтотповерхность Дартс пресс id Сортировка значений:
ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id') AS UNSIGNED)
если столбец индивидуальной генерации определен как использовать ORDER BY То же выражение изповерхности в Оптимизатор MySQL это распознает.,并考虑Воляиндексиспользуется для План выполнения запроса。Видеть“Раздел 10.3.11 генерироватьиндекс столбцаизоптимизацияиспользовать”。
То же, что и другие типы данных,для JSON Достойныйполимеризация,SQL NULL Значение игнорируется. Нет NULL Значения преобразуются в числовые типы и агрегируются, но MIN()、MAX() и GROUP_CONCAT() удалить. По количеству скаляриз JSON ценить, преобразование в число должно давать значимые результаты, хотя (в зависимости от ценить) может произойти усечение и потеря точности. Конвертировать другие JSON ценить как число может не дать значимых результатов.