PostgreSQL bietet zwei Typen zum Speichern von JSON-Daten: json
und jsonb
. Um effiziente Abfragemechanismen für diese Datentypen zu implementieren, bietet PostgreSQL auch den in Abschnitt 8.14.6 beschriebenen Datentyp jsonpath an .
Die Datentypen json
und jsonb
akzeptieren nahezu identische Wertesätze als Eingabe. Der wesentliche praktische Unterschied besteht in der Effizienz. Der
json
Datentyp speichert eine exakte Kopie des Eingabetextes, die die Verarbeitungsfunktionen bei jeder Ausführung erneut analysieren müssen. während jsonb
Daten in ein zerlegt Binärformat , das es etwas langsamer Eingang macht es aufgrund der für Umwandlung Aufwand, aber deutlich schneller Prozess gespeichert ist, da kein neuparsen benötigt wird. jsonb
unterstützt auch die Indizierung, was ein erheblicher Vorteil sein kann.
Da der json
Typ eine exakte Kopie des Eingabetextes speichert, bleiben semantisch unbedeutende Leerzeichen zwischen Token sowie die Reihenfolge der Schlüssel in JSON-Objekten erhalten. Wenn ein JSON-Objekt innerhalb des Werts mehr als einmal denselben Schlüssel enthält, werden alle Schlüssel / Wert-Paare beibehalten. (Die Verarbeitungsfunktionen betrachten den letzten Wert als den operativen Wert.) Im Gegensatz dazu wird jsonb
der Leerraum nicht beibehalten, die Reihenfolge der Objektschlüssel wird nicht beibehalten und es werden keine doppelten Objektschlüssel beibehalten. Wenn in der Eingabe doppelte Schlüssel angegeben sind, wird nur der letzte Wert beibehalten.
Im Allgemeinen sollten die meisten Anwendungen es vorziehen, JSON-Daten als zu speichern
jsonb
, es sei denn, es gibt ganz spezielle Anforderungen, wie z. B. ältere Annahmen zur Reihenfolge der Objektschlüssel.
PostgreSQL erlaubt nur eine Zeichensatzcodierung pro Datenbank. Es ist daher nicht möglich, dass die JSON-Typen starr der JSON-Spezifikation entsprechen, es sei denn, die Datenbankcodierung ist UTF8. Versuche, Zeichen, die nicht in der Datenbankcodierung dargestellt werden können, direkt einzuschließen, schlagen fehl. Umgekehrt sind Zeichen zulässig, die in der Datenbankcodierung, jedoch nicht in UTF8 dargestellt werden können.