O PostgreSQL oferece dois tipos para armazenar dados JSON: json
e jsonb
. Para implementar mecanismos de consulta eficientes para esses tipos de dados, o PostgreSQL também fornece o tipo de dados jsonpath descrito na Seção 8.14.6 .
Os tipos de dados json
e jsonb
aceitam conjuntos de valores quase idênticos como entrada. A principal diferença prática é a da eficiência. O
json
tipo de dados armazena uma cópia exata do texto de entrada, cujas funções de processamento devem analisar novamente a cada execução; enquanto os jsonb
dados são armazenados em um formato binário decomposto, que torna a entrada um pouco mais lenta devido à sobrecarga adicional da conversão, mas significativamente mais rápida de processar, pois não é necessária nenhuma nova correção. jsonb
também suporta indexação, o que pode ser uma vantagem significativa.
Como o json
tipo armazena uma cópia exata do texto de entrada, preservará o espaço em branco semanticamente insignificante entre os tokens, bem como a ordem das chaves nos objetos JSON. Além disso, se um objeto JSON dentro do valor contiver a mesma chave mais de uma vez, todos os pares chave / valor serão mantidos. (As funções de processamento consideram o último valor como o operacional.) Por outro lado, jsonb
não preserva o espaço em branco, não preserva a ordem das chaves do objeto e não mantém as chaves duplicadas do objeto. Se chaves duplicadas forem especificadas na entrada, apenas o último valor será mantido.
Em geral, a maioria dos aplicativos deve preferir armazenar dados JSON como
jsonb
, a menos que haja necessidades bastante especializadas, como suposições herdadas sobre a ordem de chaves de objetos.
O PostgreSQL permite apenas uma codificação de conjunto de caracteres por banco de dados. Portanto, não é possível que os tipos JSON estejam em conformidade rígida com a especificação JSON, a menos que a codificação do banco de dados seja UTF8. Tentativas de incluir diretamente caracteres que não podem ser representados na codificação do banco de dados falharão; por outro lado, serão permitidos caracteres que possam ser representados na codificação do banco de dados, mas não no UTF8.