JSON против Serialized Array в базе данных

Каковы преимущества и недостатки хранения данных JSON в базе данных MySQL или сериализованном массиве?

  1. JSON encode () & decode ()
    • Версия PHP> = 5.0.0
      • Предел вложения 20.
    • Версия PHP> = 5.2.3
      • Предел вложения 128.
    • Версия PHP> = 5.3.0
      • Предел вложения 512.
    • Малая занимаемая площадь и строка сериализации PHP.
  2. serialize () & unserialize ()
    • Версия PHP> = 4.0.0
      • Методы не теряются в объекте Datatype PHP.
      • __wakeup () магический метод, вызываемый для любого несериализуемого объекта. (ОЧЕНЬ МОГУЩЕСТВЕННЫЙ)
      • Было отмечено, что в некоторых случаях лучше всего кодировать строки base64 в базу данных, а base64 декодирует строки, извлеченные из базы данных с помощью этой функции, так как есть некоторые проблемы с обработкой некоторых символов пробела.

Выбор ваш.

Pro JSON:

  • Данные JSON могут использоваться многими разными языками, а не только PHP
  • Данные JSON доступны для чтения и записи.
  • Это занимает меньше места
  • Быстрее кодировать JSON, чем сериализовать

Pro Serialized Array:

  • Он быстрее выполняет неэтериализацию, чем декодирование JSON

Как видно из комментариев, JSON занимает меньше места, чем массив сериализации. Я также проверил, ускорен ли JSON или Serializing, и, что удивительно, он быстрее кодируется JSON, чем Serialize. Тем не менее, он быстрее несериализуется, чем декодирование JSON.

Это сценарий, который я использовал для тестирования:

<?php function runTime(){ $mtime = microtime(); $mtime = explode(' ', $mtime); $mtime = $mtime[1] + $mtime[0]; return $mtime; } ?> <pre> <?php $start = runTime(); $ser; for($i=0; $i<1000; $i++){ $a = array(a => 1, x => 10); $ser = serialize($a); } $total = runTime() - $start; echo "Serializing 1000 times took \t$total seconds"; ?> <?php $start = runTime(); $json; for($i=0; $i<1000; $i++){ $a = array(a => 1, x => 10); $json = json_encode($a); } $total = runTime() - $start; echo "JSON encoding 1000 times took \t$total seconds"; ?> <?php $start = runTime(); $ser; for($i=0; $i<1000; $i++){ $a = unserialize($ser); } $total = runTime() - $start; echo "Unserializing 1000 times took \t$total seconds"; ?> <?php $start = runTime(); $json; for($i=0; $i<1000; $i++){ $a = json_decode($json); } $total = runTime() - $start; echo "JSON decoding 1000 times took \t$total seconds"; ?> </pre> 

Переносимость: победитель JSON. JSON поддерживается на более широком спектре платформ, а PHP-де-сериализация поддерживается только (насколько мне известно) PHP. Хотя возможно разбор любого формата на любом языке, JSON имеет больше встроенных библиотек.

Будущее доказательство: победитель JSON. JSON является «стандартным», в том смысле, что Javascript является стандартом и вряд ли изменится в будущем. Группа PHP не давала никаких обещаний о будущем формата сериализации, и, хотя это вряд ли изменится в будущем, тот факт, что одна группа контролирует формат, означает, что вы можете в конечном итоге получить будущие данные, которые не читаются.

Верность: победитель PHP. Сериализация PHP позволит вам хранить данные с собственными типами данных PHP, включая объекты, определенные пользовательскими классами. JSON позволит вам хранить общие примитивные типы, списки примитивных типов («массивы») и объекты пары «ключ / значение». Сериализация PHP может дать некоторые преимущества здесь, если вы разрабатываете приложение PHP.

Размер файла: JSON имеет небольшую победу здесь, поскольку текущий формат сериализации PHP более подробный (поскольку он хранит дополнительную информацию).

Производительность: кто знает, это зависит, профиль.

Заключение: Идите с JSON, если у вас нет веской причины использовать сериализацию PHP.

JSON более портативен, т. Е. Вы можете легко читать / писать на нем с разных языков и т. Д. Если вы использовали сериализованные массивы PHP, вы могли бы легко использовать PHP для доступа к нему.

Используете ли вы свои данные только с PHP? Если да: массивы, если нет: JSON.

Pro Array

  • сеансы использовались для сериализации: я думаю, что это быстрее, чем json_encode / decode (не совсем уверен)
  • многие функции на массивах в PHP (сортировка / слияние / …)

Pro JSON

  • JSON известен на других языках и веб-языках
  • меньше подробностей в базе данных
  • многие инструменты, такие как XML: JSON SChema

На SO было много таких вопросов.

Предпочтительный метод хранения массивов PHP (json_encode vs serialize)

Короче: JSON лучше для простых данных, но он не различает разницу между объектом и ассоциативным массивом. Сериализованные данные больше.

Используйте json для массивов и общения с Javascript или другим языком. Используйте сериализацию для объекта или любую внутреннюю работу PHP для текущего скрипта.

если вы пытаетесь обойти кавычки и специальные символы в JSON.stringify (obj), вы можете сделать это на PHP, используя его методы экранирования, специфичные для конкретной базы данных.

 <?php mysql_real_escape_string(htmlspecialchars($value)) ?> 

вы можете сохранить это безопасно и декодировать, когда вы его прочитаете

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

Но оба решения нарушают нормализацию базы данных . Ваша база данных даже не будет в первой нормальной форме, поэтому вы не сможете воспользоваться какой-либо функцией базы данных, например, искать. Лучший подход – использовать реляционное сопоставление объектов . Есть хорошие библиотеки – рассмотрим, например, доктрину ORM .

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

Случилось так, что я получил некоторые поврежденные данные в этой области. Сериализовать отображение данных с помощью таких кодов, как 'a', 's' и 'N'. Если есть поврежденные данные, карта не удалась. Он покажет ошибку php, что функция unserialize не может работать из-за ошибки байтового кода.

Поэтому я хочу избежать сериализации . Пойдите с JSON , безопаснее, и вы не столкнетесь с проблемами будущих майоров.

Для меня больше нет сериализации .

atm, json_encode () работает только с кодированными данными UTF-8 .. поэтому он не может кодировать символы, такие как «-», иначе он возвращает NULL