PostgreSQL offre due tipi di archiviazione dei dati JSON: jsone 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 jsone jsonbaccettano insiemi di valori quasi identici come input. La principale differenza pratica è quella dell'efficienza. Il
jsontipo di dati memorizza una copia esatta del testo di input, le cui funzioni di elaborazione devono ripetere l'analisi ad ogni esecuzione; mentre i jsonbdati 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. jsonbsupporta anche l'indicizzazione, che può essere un vantaggio significativo.
Poiché il jsontipo 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, jsonbnon 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.