web-dev-qa-db-fra.com

JSON vs.Serialized Array dans la base de données

Quels sont les avantages et les inconvénients du stockage des données JSON dans la base de données MySQL par rapport au tableau sérialisé?

70
Inez
  1. JSON encoder () & décoder ()
    • Version PHP> = 5.0.0
      • Limite d'imbrication de 20.
    • Version PHP> = 5.2.3
      • Limite d'imbrication de 128.
    • Version PHP> = 5.3.0
      • Limite d'imbrication de 512.
    • Petite empreinte vs chaîne sérialisée de PHP.
  2. sérialiser () & désérialiser ()
    • Version PHP> = 4.0.0
      • Les méthodes ne sont pas perdues sur PHP Objet de type de données.
      • La méthode magique __wakeup () a appelé tout objet en cours de désérialisation. (TRÈS PUISSANT)
      • Il a été noté qu'il est parfois préférable d'utiliser les chaînes encodage base64 dans la base de données, et décodage base64 chaînes retirées de la base de données avec cette fonction, car il existe certaines problèmes avec la gestion de certains espaces blancs.

Le choix t'appartient.

93
Mark Tomlin

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 et inscriptibles par l'homme.
  • Il prend moins de place
  • Il est plus rapide d'encoder JSON que de sérialiser

Réseau sérialisé Pro:

  • Il est plus rapide de désérialiser que de décoder JSON

Comme les commentaires l'indiquent, JSON prend moins d'espace qu'un tableau de sérialisation. J'ai également vérifié si JSON ou la sérialisation est plus rapide, et étonnamment, il est plus rapide d'encoder JSON que de sérialiser. Il est cependant plus rapide de désérialiser que de décoder JSON.

Voici 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
Marius

Portabilité: Winner JSON. JSON est pris en charge sur une plus grande variété de plates-formes, tandis que PHP la dé-sérialisation n'est pris 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: Gagnant JSON. JSON est un "standard", dans le sens où Javascript est un standard, et il est peu probable qu'il change à tout moment à l'avenir. Le groupe PHP n'a fait aucune promesse quant à l'avenir du format de sérialisation, et même s'il est peu probable qu'il change à l'avenir, le fait qu'un seul groupe contrôle le format signifie que vous pouvez vous retrouver avec le futur des données illisibles.

Fidelity: Gagnant PHP. PHP la sérialisation vous permettra de stocker des données avec des types de données natifs PHP, y compris des objets définis par des classes personnalisées. JSON vous permettra uniquement de stocker des types primitifs génériques, listes de types primitifs ("tableaux") et d'objets clé/paire de valeurs. PHP La sérialisation peut offrir certains 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 détaillé (car il stocke plus d'informations).

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

Conclusion: optez pour JSON sauf si vous avez une raison impérieuse d'utiliser PHP Serialization.

29
Alan Storm

JSON est plus portable, c'est-à-dire que vous pouvez plus facilement y lire/écrire à partir de différentes langues, etc. Si vous utilisez PHP tableaux sérialisés, vous ne pourrez utiliser facilement PHP pour y accéder.

7
Tom Haigh

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

Pro Array

  • les sessions ont utilisé la sérialisation: je pense que c'est plus rapide que json_encode/decode (pas tout à fait sûr)
  • de nombreuses fonctions sur les tableaux en PHP (tri/fusion/...)

Pro JSON

  • JSON est connu dans d'autres langues et langues Web
  • moins verbeux dans la base de données
  • de nombreux outils, comme XML: JSON SChema
7
mere-teresa

Il y avait beaucoup de telles questions sur SO.

Méthode préférée pour stocker PHP tableaux (json_encode vs serialize)

En bref: JSON est meilleur pour les données simples, mais il ne fait pas de différence entre l'objet et le tableau associatif. Les données sérialisées sont plus volumineuses.

4
Thinker

Utilisez json for pour les tableaux et la communication avec Javascript ou une autre langue. Utilisez serialize pour objet ou tout PHP travail interne pour le script en cours d'exécution).

3
laurens

JSON bat la sérialisation comme la plupart des réponses l'ont déjà souligné. Je pense que le plus grand avantage est son indépendance de plate-forme. Il se peut que d'autres applications communiquent avec votre base de données et qu'elles n'aient rien à voir avec php.

Mais les deux solutions violent la normalisation de la base de données . Votre base de données ne sera même pas en première forme normale vous ne pouvez donc pas profiter d'une fonctionnalité de base de données comme, par exemple, la recherche. Une meilleure approche consiste à utiliser mappage relationnel objet . Il existe de bonnes bibliothèques - pensez par exemple à doctrine ORM .

2
Francois Bourgeois

si vous essayez de contourner les guillemets et les caractères spéciaux dans votre JSON.stringify (obj), vous pouvez le faire dans 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 lisez

2
tim

Je viens d'avoir ce gros problème avec php sérialiser. J'ai stocké beaucoup de données dans un seul champ dans lequel j'ai utilisé nserialize pour lire.

Ce qui s'est passé, c'est que j'ai obtenu des données corrompues dans ce domaine. Sérialiser mapper 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 de désérialisation ne peut pas fonctionner en raison d'une erreur de code d'octet.

Mon point est donc d'éviter sérialiser. Allez avec JSON , bien plus sûr et vous ne vous cognerez pas sur les futurs problèmes majeurs.

Pour moi, pas plus sérialiser.

1