JSON vs. Serialized Array in Datenbank [geschlossen]

70

Welche Vor- und Nachteile hat das Speichern von JSON-Daten in einer MySQL-Datenbank im Vergleich zu einem serialisierten Array?

Inez
quelle

Antworten:

93
  1. JSON encode () & decode ()
    • PHP-Version> = 5.0.0
      • Verschachtelungsgrenze von 20.
    • PHP-Version> = 5.2.3
      • Verschachtelungsgrenze von 128.
    • PHP-Version> = 5.3.0
      • Verschachtelungsgrenze von 512.
    • Geringer Platzbedarf im Vergleich zur serialisierten Zeichenfolge von PHP.
  2. serialize () & unserialize ()
    • PHP-Version> = 4.0.0
      • Methoden gehen beim PHP-Datentypobjekt nicht verloren.
      • __wakeup () magische Methode, die für jedes Objekt aufgerufen wird, das unserialisiert wird. (SEHR KRAFTVOLL)
      • Es wurde festgestellt, dass es manchmal am besten ist, die in die Datenbank gespeicherten Base64-Codierungszeichenfolgen und die mit dieser Funktion aus der Datenbank entnommenen Base64-Decodierungszeichenfolgen zu verwenden, da es einige Probleme bei der Behandlung einiger Leerzeichen gibt.

Es ist deine Entscheidung.

Mark Tomlin
quelle
15
Upvoted für __wakeup ().
Altermativ
Ich speichere von Twitter zurückgegebenes JSON, also brauchte ich den base64_encode, um das Entkommen von funky Charakteren zu umgehen.
Eric Cope
Ganz wichtig ist, serializedass der korrekte serialisierte
Arnis Juraga
86

Pro JSON:

  • Die JSON-Daten können von vielen verschiedenen Sprachen verwendet werden, nicht nur von PHP
  • JSON-Daten sind für Menschen lesbar und beschreibbar.
  • Es nimmt weniger Platz ein
  • JSON ist schneller zu codieren als zu serialisieren

Pro Serialized Array:

  • Unserialisieren ist schneller als JSON-Dekodierung

Wie aus den Kommentaren hervorgeht, nimmt JSON weniger Speicherplatz ein als ein Serialisierungsarray. Ich habe auch überprüft, ob JSON oder Serialisierung schneller ist, und überraschenderweise ist die JSON-Codierung schneller als die Serialisierung. Unserialisieren ist jedoch schneller als JSON-Dekodieren.

Dies ist das Skript, das ich zum Testen verwendet habe:

<?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>
Marius
quelle
+6 für falsche Antwort? JSON: {"x": 1, "b": "e"} Serliaze: a: 2: {s: 1: "x"; i: 1; s: 1: "b"; s: 1: "e ";} JSON nimmt also weniger Platz ein ...
Thinker
Vielen Dank, Thinker. Ich dachte, der PHP-Serializer serialisiert ihn in eine Art Bytecode, definitiv keine Zeichenfolge. Ich bin jetzt ziemlich enttäuscht.
Marius
3
Das serialisierte PHP-Format enthält die Länge der Elemente (Zeichenfolgen und Arrays). Daher ist das Schreiben langsamer als json (json speichert das nicht), aber schneller zu lesen (wenn Sie wissen, was Sie beim Lesen einer Datei erwarten, gibt es weniger Bedingungslogik zu implementieren, zum Beispiel eine Reihe von 2000 Zeichen zu importieren , es ist genug , um die nächsten 2000 Zeichen ohne zu prüfen , jedes Mal , wenn die aktuellen Zeichen gibt das Ende der Zeichenfolge zu lesen , wie es für json_decode) getan hat
Elvis Ciotti
Hinweis: MySQL 5.7.8+ Enthält native Unterstützung für JSON
dreftymac
29

Portabilität: Gewinner JSON. JSON wird auf einer größeren Vielfalt von Plattformen unterstützt, während die PHP-De-Serialisierung (soweit ich weiß) nur von PHP unterstützt wird. Während es möglich ist, beide Formate in jeder Sprache zu analysieren, verfügt JSON über mehr vorgefertigte Bibliotheken.

Zukunftssicher: Gewinner JSON. JSON ist ein "Standard" in dem Sinne, dass Javascript ein Standard ist und sich in Zukunft wahrscheinlich nicht ändern wird. Die PHP-Gruppe hat keine Zusagen bezüglich der Zukunft des Serialisierungsformats gemacht, und obwohl es unwahrscheinlich ist, dass sich dies in Zukunft ändert, bedeutet die Tatsache, dass eine einzelne Gruppe das Format steuert, dass Sie möglicherweise zukünftige Daten erhalten, die nicht lesbar sind.

Treue: Gewinner PHP. Mit der PHP-Serialisierung können Sie Daten mit nativen PHP-Datentypen speichern, einschließlich Objekten, die von benutzerdefinierten Klassen definiert wurden. Mit JSON können Sie nur generische primitive Typen, Listen primitiver Typen ("Arrays") und Schlüssel / Wert-Paar-Objekte speichern. Die PHP-Serialisierung kann hier einige Vorteile bieten, wenn Sie eine PHP-Anwendung entwickeln.

Dateigröße: JSON hat hier einen leichten Gewinn, da das aktuelle Serialisierungsformat von PHP ausführlicher ist (da mehr Informationen gespeichert werden).

Leistung: Wer weiß, es kommt auf das Profil an.

Fazit: Entscheiden Sie sich für JSON, es sei denn, Sie haben einen zwingenden Grund, die PHP-Serialisierung zu verwenden.

Alan Storm
quelle
7

JSON ist portabler, dh Sie können es leichter aus verschiedenen Sprachen usw. lesen / schreiben. Wenn Sie PHP-serialisierte Arrays verwenden, können Sie nur PHP verwenden, um darauf zuzugreifen.

Tom Haigh
quelle
Nicht einverstanden, wenn als Microservice verwendet, wäre dies kein Problem
Yoosuf Mohamed
@Yoosuf womit bist du nicht einverstanden? Ich habe nie gesagt, dass es ein Problem ist.
Tom Haigh
7

Verwenden Sie Ihre Daten nur mit PHP? Wenn ja: Arrays, wenn nein: JSON.

Pro Array

  • Sitzungen verwendet Serialisierung: Ich denke, es ist schneller als json_encode / decode (nicht ganz sicher)
  • viele Funktionen auf Arrays in PHP (Sortieren / Zusammenführen / ...)

Pro JSON

  • JSON ist in anderen Sprachen und Web-Sprachen bekannt
  • weniger ausführlich in der Datenbank
  • viele Tools wie XML: JSON SChema
bloße Teresa
quelle
4

Es gab viele solcher Fragen zu SO.

Bevorzugte Methode zum Speichern von PHP-Arrays (json_encode vs serialize)

Kurz gesagt: JSON ist besser für einfache Daten, unterscheidet jedoch nicht zwischen Objekt und assoziativem Array. Serialisierte Daten sind größer.

Denker
quelle
JSON unterscheidet zwischen Objekten und Arrays, {"member1": "value", "member2": ["member1", "member2"]}
LM.
3
LithMaster, Sie sollten lernen, was ein assoziatives Array ist. Es ist kein Array wie in Ihrem Beispiel.
Denker
3

Verwenden Sie json für Arrays und die Kommunikation mit Javascript oder einer anderen Sprache. Verwenden Sie serialize für Objekte oder interne PHP-Arbeiten für das aktuell ausgeführte Skript.

Laurens
quelle
2

Wenn Sie versuchen, Anführungszeichen und Sonderzeichen in Ihrer JSON.stringify (obj) zu umgehen, können Sie dies in PHP mithilfe der datenbankspezifischen Escape-Methoden tun.

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

Sie können dies jetzt sicher speichern und dekodieren, wenn Sie es wieder vorlesen

tim
quelle
2

JSON schlägt die Serialisierung, wie die meisten Antworten bereits gezeigt haben. Ich denke, der größte Vorteil ist die Plattformunabhängigkeit. Möglicherweise kommunizieren andere Anwendungen mit Ihrer Datenbank und sie haben möglicherweise nichts mit PHP zu tun.

Aber beide Lösungen verletzen Datenbank Normalisierung . Ihre Datenbank befindet sich nicht einmal in der ersten normalen Form, sodass Sie keine Datenbankfunktion wie beispielsweise die Suche nutzen können. Ein besserer Ansatz ist die Verwendung der objektrelationalen Zuordnung . Es gibt gute Bibliotheken da draußen - denken Sie zum Beispiel an die Lehre ORM .

Francois Bourgeois
quelle
1

Ich hatte gerade dieses große Problem mit PHP Serialize . Ich habe viele Daten in einem einzigen Feld gespeichert, in dem ich unserialize zum Lesen verwendet habe.

Was passiert ist, dass ich einige beschädigte Daten in diesem Feld habe. Serialize ordne die Daten mit Codes wie 'a', 's' und 'N' zu. Wenn beschädigte Daten vorhanden sind, ist die Zuordnung fehlgeschlagen. Es wird ein PHP-Fehler angezeigt, dass die Funktion Unserialize aufgrund eines Bytecode-Fehlers nicht funktioniert.

Mein Punkt ist es also, eine Serialisierung zu vermeiden . Gehen Sie mit JSON , viel sicherer und Sie werden sich bei zukünftigen Majors-Problemen nicht den Kopf zerbrechen.

Für mich keine Serialisierung mehr .

SequenceDigitale.com
quelle
-5

atm, json_encode () funktioniert nur mit UTF-8-codierten Daten. Daher können keine Zeichen wie "ñ" codiert werden, andernfalls wird NULL zurückgegeben

Ronald
quelle
3
UTF-8-codierte Daten können leicht ñ darstellen.
ntd