MySQL JSON пересортировка ключей объекта

315
15 сентября 2017, 22:16

Как не допускать сортировку ключей объекта при записи в бд MySQL JSON? Есть много вещей где сохранение порядка ключей очень важно..Например другие SQL бд, сохраняют эту позицию, взять к примеру MongoDB, так с чего же MySQL не сохраняет?

правка: Решение проблемы Спасибо за ответы, очень благодарен! По моему мнению и как выяснилось другими участниками вопроса,то единственное самое верное решение этой проблемы, заключается в создании дополнительного ключа со значением о позиции объекта, в моем конкретном случае это к примеру имеем такой JSON объект

    {
   "value": {
    "pos": 2,
    "type": "string"
   },
   "schema": {
    "pos": 1,
    "type": "string"
   },
   "to_lang": {
    "pos": 3,
    "type": "string"
   }
  }

в следствии работы с MySQL JSON(запись,чтение), ключи пересортировываются.. мы храним объект в том же виде, а там где нужна позиция, используем значение pos, и переделываем объект в массив. в моем случае на Js решил такой функцией

        function sortObject(obj) {
        var arr = [];
        var prop;
        for (prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                obj[prop].key = prop;
                arr.push(obj[prop]);
            }
        }
        arr.sort(function(a, b) {
            return a.pos - b.pos;
        });
        return arr; // возвращаем массив
    }

Конечно если Вы используете готовые решения,как например JSON формы, то придется копать кучу кода, и найти нужное место,чтобы присвоить это изменение, но в принципе у меня получилось решить это буквально за пару минут. для тех кто не готов применять изменения, как единственный альтернативный вариант где не придется ничего изменять, это сохранение нужной части JSON как "строку", для этого столбец в таблице должен быть в формате LONGTEXT,или в другом формате, исключая JSON, тогда используя функцию MySQL JSON_SET будем записывать значения в JSON как строку, потом естественно декодируем это дело, и получаем сохраненные позиции ключей.. минус данного варианта, что является по сути "костылем", т.к в таком хранении данных, стандартного доступа к ключам строкового объекта не будет. Пример записи json как строки sqlFiddle https://www.db-fiddle.com/f/84nBFaZXxEtHrXGzzNrh9k/0

Answer 1

MySQL хранит JSON в своём внутреннем формате, фактически воссоздавая текстовое представление перед возвращением клиенту:

JSON documents stored in JSON columns are converted to an internal format that permits quick read access to document elements.

а также

To make lookups more efficient, it (i.e. MySQL) also sorts the keys of a JSON object.

Так что изменение порядка ключей - это by design. Подробнее см. в мануале.

Если порядок ключей имеет значение, трудно предложить что-то лучше, чем хранение данных в варчарах. Либо (см. RFC7159) хранить данные в массиве, который гарантирует порядок элементов:

JSON can represent four primitive types (strings, numbers, booleans, and null) and two structured types (objects and arrays).

...

An array is an ordered sequence of zero or more values.

READ ALSO
Проблема с включением в скрипт шаблонов с одинаковыми функциями

Проблема с включением в скрипт шаблонов с одинаковыми функциями

Всем приветВсю голову сломал, помогите советом

270
1С с сайтом создать xml файл [требует правки]

1С с сайтом создать xml файл [требует правки]

Из 1с получается выгрузить данний на сайт но обратно не знаю как правильно создать xml файл,Заказы

261
Фильтр товаров по цене на yii2

Фильтр товаров по цене на yii2

Есть простая форма поиска по цене(форма с input type="text"), вводим цену и она ищет все товары по вводной цене, нужно его реализовать c input type="checkbox"...

651
Проверить массив

Проверить массив

Если массив пустой выводиться сообщение "Ошибка в параметре, оно должно быть числом!"Если в массиве 'Слово' вновь выводится "Ошибка в параметре,...

272