PostgreSQL offre due tipi di archiviazione dei dati JSON: json
e jsonb
. Per implementare meccanismi di query efficienti per questi tipi di dati, PostgreSQL fornisce anche il tipo di dati jsonpath descritto nella Sezione 8.14.6 .
I tipi di dati json
e jsonb
accettano insiemi di valori quasi identici come input. La principale differenza pratica è quella dell'efficienza. Il
json
tipo di dati memorizza una copia esatta del testo di input, le cui funzioni di elaborazione devono ripetere l'analisi ad ogni esecuzione; mentre i jsonb
dati sono archiviati in un formato binario decomposto che rende leggermente più lento l'input a causa del sovraccarico di conversione aggiunto, ma significativamente più veloce da elaborare, poiché non è necessario il reimpostazione. jsonb
supporta anche l'indicizzazione, che può essere un vantaggio significativo.
Poiché il json
tipo memorizza una copia esatta del testo di input, conserverà uno spazio bianco semanticamente insignificante tra i token, nonché l'ordine delle chiavi all'interno degli oggetti JSON. Inoltre, se un oggetto JSON all'interno del valore contiene la stessa chiave più di una volta, vengono mantenute tutte le coppie chiave / valore. (Le funzioni di elaborazione considerano l'ultimo valore come quello operativo.) Al contrario, jsonb
non preserva lo spazio bianco, non conserva l'ordine delle chiavi dell'oggetto e non mantiene le chiavi duplicate dell'oggetto. Se nell'input vengono specificate chiavi duplicate, viene mantenuto solo l'ultimo valore.
In generale, la maggior parte delle applicazioni dovrebbe preferire archiviare i dati JSON come
jsonb
, a meno che non ci siano esigenze abbastanza specializzate, come ipotesi legacy sull'ordinamento di chiavi oggetto.
PostgreSQL consente solo una codifica del set di caratteri per database. Pertanto, non è possibile che i tipi JSON si conformino rigidamente alla specifica JSON a meno che la codifica del database non sia UTF8. I tentativi di includere direttamente i caratteri che non possono essere rappresentati nella codifica del database falliranno; al contrario, saranno consentiti caratteri che possono essere rappresentati nella codifica del database ma non in UTF8.