JSON vs. Sérialized Array dans la base de données [fermé]

Quels sont les avantages et les inconvénients de stocker des données JSON dans la base de données MySQL par rapport à un tableau sérialisé?

64
demandé sur dreftymac 2009-08-20 18:53:49

11 réponses

  1. JSON coder () & décoder ()
    • version PHP >= 5.0.0
      • limite de nidification de 20.
    • version PHP > = 5.2.3
      • limite de nidification de 128.
    • version PHP > = 5.3.0
      • limite de nidification de 512.
    • petite empreinte vs chaîne serialize de PHP.
  2. sérialiser () & unserialize ()
    • version PHP >= 4.0.0 Les méthodes
      • ne sont pas perdues sur L'objet PHP Datatype.
      • __wakeup() la méthode magique appelée sur n'importe quel objet unserialize. (TRÈS PUISSANT)
      • il a été noté que c'est parfois le meilleur base64 encode chaînes mises dans la base de données, et base64 decode chaînes sorties de la base de données avec cette fonction, car il ya des problèmes avec la manipulation de certains caractères blancs de l'espace.

le choix vous appartient.

89
répondu Mark Tomlin 2009-11-12 10:08:12

Pro JSON:

  • les données JSON peuvent être utilisées par de nombreux langages différents, pas seulement PHP
  • les données JSON sont lisibles par l'homme et peuvent être écrites.
  • Il prend moins de place
  • il est plus rapide d'encoder JSON que de sérialiser

Pro Sérialisé Tableau:

  • il est plus rapide do unserialize qu'à JSON decode

comme les commentaires l'indiquent, JSON prend moins d'espace qu'un tableau serialize. J'ai aussi vérifié si JSON ou Serializing est plus rapide, et étonnamment, il est plus rapide à encoder JSON qu'à Serialiser. Il est plus rapide à unserialize qu'à JSON decode cependant.

C'est le script que j'ai utilisé pour tester:

<?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>
84
répondu Marius 2009-08-21 02:21:36

portabilité: vainqueur JSON. JSON est pris en charge sur une plus grande variété de plateformes, tandis que la désérialisation de PHP n'est prise en charge (pour autant que je sache) que par PHP. Bien qu'il soit possible d'analyser l'un ou l'autre format dans n'importe quelle langue, JSON a plus de bibliothèques pré-construites.

Future Proof: Winner JSON. JSON est un "standard", dans le sens où Javascript est un standard, et il est peu probable qu'il change à l'avenir. Le groupe PHP n'a fait aucune promesse sur l'avenir de la le format de sérialisation, et bien qu'il soit peu probable de changer dans le futur, le fait qu'un seul groupe contrôle le format signifie que vous pouvez vous retrouver avec des données futures qui sont illisibles.

Fidélité: Vainqueur PHP. La sérialisation PHP vous permettra de stocker des données avec des types de données PHP natifs, y compris des objets définis par des classes personnalisées. JSON ne vous permettra de stocker que des types primitifs génériques, des listes de types primitifs ("tableaux") et des objets de paire clé/valeur. La sérialisation de PHP peut fournir quelques avantages ici si vous développez une application PHP.

Taille du fichier: JSON a une légère victoire ici, car le format de sérialisation actuel de PHP est plus verbeux (car il stocke plus d'informations).

Performance: Qui sait, cela dépend, de profil.

Conclusion: allez avec JSON sauf si vous avez une raison impérieuse d'utiliser la sérialisation PHP .

29
répondu Alan Storm 2009-11-12 00:34:48

JSON est plus portable, i.e. vous pouvez plus facilement lire/écrire à partir de différentes langues, etc. Si vous utilisiez des tableaux avec série PHP, vous ne seriez capable d'utiliser PHP que facilement pour y accéder.

7
répondu Tom Haigh 2009-08-20 14:58:32

utilisez-vous vos données uniquement avec PHP ? Si oui: tableaux, si non: JSON.

Pro Array

  • séances de sérialisation : je pense que c'est plus rapide que json_encode/décodage (pas tout à fait sûr)
  • de nombreuses fonctions sur les tableaux en PHP (tri/merging/...)

Pro JSON

  • JSON est de savoir dans d'autres langues et langages web
  • moins verbeux dans la base de données
  • de nombreux outils, comme XML: JSON SChema
7
répondu mere-teresa 2009-08-20 15:15:14

il y avait beaucoup de telles questions sur SO.

méthode Préférée pour stocker les tableaux PHP (json_encode vs sérialiser)

en bref: JSON est préférable pour les données simples, mais il ne distingue pas la différence entre l'objet et le tableau associatif. Données sérialisées sont plus grands.

4
répondu Thinker 2017-05-23 12:10:54

utiliser json pour les tableaux et la communication avec Javascript ou un autre langage. Utilisez serialize pour object ou N'importe quel travail PHP interne pour le script courant.

3
répondu laurens 2012-06-08 23:36:58

si vous essayez de contourner des citations et des caractères spéciaux dans votre JSON.stringify (obj), vous pouvez le faire en PHP en utilisant ses méthodes d'échappement spécifiques à la base de données.

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

vous pouvez maintenant le stocker en toute sécurité et le décoder lorsque vous le relisez

2
répondu tim 2011-11-16 23:39:12

JSON battements de sérialisation comme la plupart des réponses déjà souligné. Je pense que le plus grand avantage est son indépendance vis-à-vis de la plateforme. Vous avez peut-être d'autres applications qui communiquent avec votre base de données et elles n'ont peut-être rien à voir avec php.

Mais les deux solutions violer la normalisation de base de données . Votre base de données ne sera même pas dans première forme normale de sorte que vous ne pouvez pas profiter de fonction de base de données comme, disons, la recherche. Une meilleure approche est d'utiliser des mapping objet-relationnel . Il ya de bonnes bibliothèques là - bas-considérez par exemple doctrine ORM .

2
répondu Francois Bourgeois 2013-02-07 11:53:13

je viens d'avoir ce gros problème avec PHP serialize . J'ai stocké beaucoup de données dans un seul champ dans lequel j'ai utilisé unserialize à lire.

ce qui s'est passé, c'est que j'ai eu des données corrompues dans ce domaine. Serialize map les données avec des codes comme 'a', 's'et ' N'. S'il y a des données corrompues, la carte a échoué. Il affichera une erreur php que la fonction unserialize est incapable de fonctionner à cause d'une erreur de code octet.

Donc, mon point est d'éviter sérialiser . Allez avec JSON , bien plus sûr et vous ne vous cognerez pas la tête sur de futurs problèmes majeurs.

Pour moi, pas plus sérialiser .

1
répondu SequenceDigitale.com 2013-01-16 19:47:12

atm, json_encode () ne fonctionne qu'avec des données encodées UTF-8.. par conséquent, il ne peut pas encoder des caractères tels que "ñ", sinon il renvoie NULL

-5
répondu Ronald 2010-02-07 01:30:17