PostgreSQL cung cấp hai loại để lưu trữ dữ liệu JSON: json
và jsonb
. Để thực hiện các cơ chế truy vấn hiệu quả cho các loại dữ liệu này, PostgreSQL cũng cung cấp loại dữ liệu jsonpath được mô tả trong Phần 8.14.6 .
Các kiểu dữ liệu json
và jsonb
chấp nhận các bộ giá trị gần như giống hệt nhau làm đầu vào. Sự khác biệt thực tế chính là một trong những hiệu quả. Kiểu
json
dữ liệu lưu trữ một bản sao chính xác của văn bản đầu vào, mà các hàm xử lý phải lặp lại trên mỗi lần thực hiện; trong khi jsonb
dữ liệu được lưu trữ ở định dạng nhị phân phân tách khiến đầu vào chậm hơn một chút do chi phí chuyển đổi được thêm vào, nhưng xử lý nhanh hơn đáng kể, vì không cần phải xử lý lại.jsonb
cũng hỗ trợ lập chỉ mục, có thể là một lợi thế đáng kể.
Vì json
loại lưu trữ một bản sao chính xác của văn bản đầu vào, nó sẽ duy trì khoảng trắng không đáng kể về mặt ngữ nghĩa giữa các mã thông báo, cũng như thứ tự các khóa trong các đối tượng JSON. Ngoài ra, nếu một đối tượng JSON trong giá trị chứa cùng một khóa nhiều lần, tất cả các cặp khóa / giá trị sẽ được giữ. (Các hàm xử lý coi giá trị cuối cùng là giá trị hoạt động.) Ngược lại,jsonb
không bảo toàn khoảng trắng, không bảo toàn thứ tự của các khóa đối tượng và không giữ các khóa đối tượng trùng lặp. Nếu các khóa trùng lặp được chỉ định trong đầu vào, chỉ giữ giá trị cuối cùng.
Nói chung, hầu hết các ứng dụng nên lưu trữ dữ liệu JSON như
jsonb
, trừ khi có các nhu cầu khá chuyên biệt, chẳng hạn như các giả định cũ về việc sắp xếp các khóa đối tượng.
PostgreSQL chỉ cho phép mã hóa một ký tự cho mỗi cơ sở dữ liệu. Do đó, các loại JSON không thể tuân thủ cứng nhắc với đặc tả JSON trừ khi mã hóa cơ sở dữ liệu là UTF8. Nỗ lực bao gồm trực tiếp các ký tự không thể được trình bày trong mã hóa cơ sở dữ liệu sẽ thất bại; ngược lại, các ký tự có thể được biểu diễn trong mã hóa cơ sở dữ liệu nhưng không có trong UTF8 sẽ được cho phép.