PostgreSQL ofrece dos tipos para almacenar datos JSON: json
y jsonb
. Para implementar mecanismos de consulta eficientes para estos tipos de datos, PostgreSQL también proporciona el tipo de datos jsonpath descrito en la Sección 8.14.6 .
Los tipos de datos json
y jsonb
aceptan conjuntos de valores casi idénticos como entrada. La principal diferencia práctica es la de la eficiencia. El
json
tipo de datos almacena una copia exacta del texto de entrada, que las funciones de procesamiento deben analizar en cada ejecución; mientras que los jsonb
datos se almacenan en un formato binario descompuesto que hace que la entrada sea un poco más lenta debido a la sobrecarga de conversión agregada, pero es significativamente más rápido de procesar, ya que no se necesita volver a analizar. jsonb
También es compatible con la indexación, que puede ser una ventaja significativa.
Debido a que el json
tipo almacena una copia exacta del texto de entrada, conservará espacios en blanco semánticamente insignificantes entre los tokens, así como el orden de las claves dentro de los objetos JSON. Además, si un objeto JSON dentro del valor contiene la misma clave más de una vez, se conservan todos los pares clave / valor. (Las funciones de procesamiento consideran el último valor como el operativo). Por el contrario, jsonb
no conserva el espacio en blanco, no conserva el orden de las claves de objeto y no conserva las claves de objeto duplicadas. Si se especifican claves duplicadas en la entrada, solo se conserva el último valor.
En general, la mayoría de las aplicaciones deberían preferir almacenar datos JSON como
jsonb
, a menos que haya necesidades bastante especializadas, como los supuestos heredados sobre el pedido de claves de objeto.
PostgreSQL solo permite la codificación de un juego de caracteres por base de datos. Por lo tanto, no es posible que los tipos JSON se ajusten rígidamente a la especificación JSON a menos que la codificación de la base de datos sea UTF8. Los intentos de incluir directamente caracteres que no se puedan representar en la codificación de la base de datos fallarán; por el contrario, se permitirán caracteres que se puedan representar en la codificación de la base de datos pero no en UTF8.