Каковы преимущества и недостатки хранения данных JSON в базе данных MySQL или сериализованном массиве?
JSON против Serialized Array в базе данных
Ответ 1
- JSON encode() и decode()
- Версия PHP >= 5.0.0
- Предел вложения 20.
- Версия PHP >= 5.2.3
- Ограничение вложения 128.
- Версия PHP >= 5.3.0
- Ограничение вложенности 512.
- Строка с малым размером и строкой PHP.
- Версия PHP >= 5.0.0
- serialize() и unserialize()
- Версия PHP >= 4.0.0
- Методы не теряются в объекте Datatype PHP.
- __ метод wakeup() магии, вызываемый для любого несериализуемого объекта. (ОЧЕНЬ МОЩНЫЙ)
- Было отмечено, что в несколько раз лучше всего использовать base64 encode строки, помещенные в базу данных, и base64 decode строки, извлеченные из базы данных с помощью этой функции, так как есть некоторые проблемы с обработкой некоторых символов пробела.
- Версия PHP >= 4.0.0
Выбор за вами.
Ответ 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
Ответ 6
На SO было много таких вопросов.
Предпочтительный метод хранения массивов PHP (json_encode vs serialize)
Вкратце: JSON лучше для простых данных, но он не различает разницу между объектом и ассоциативным массивом. Сериализованные данные больше.
Ответ 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