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.
  • serialize() и unserialize()
    • Версия PHP >= 4.0.0
      • Методы не теряются в объекте Datatype PHP.
      • __ метод wakeup() магии, вызываемый для любого несериализуемого объекта. (ОЧЕНЬ МОЩНЫЙ)
      • Было отмечено, что в несколько раз лучше всего использовать base64 encode строки, помещенные в базу данных, и base64 decode строки, извлеченные из базы данных с помощью этой функции, так как есть некоторые проблемы с обработкой некоторых символов пробела.

Выбор за вами.

Ответ 2

Pro JSON:

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

Serialized Array:

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

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

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

<?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>

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Pro Array

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

Pro JSON

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

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

Ответ 11

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