← Назад к вопросам

В чем разница между JSON и JSONB в PostgreSQL?

2.0 Middle🔥 131 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

JSON vs JSONB в PostgreSQL

PostgreSQL поддерживает два типа данных для работы с JSON: JSON и JSONB. Они различаются способом хранения, производительностью и функциональностью.

Основные различия

JSON — текстовый формат

  • Хранится как текст (строка)
  • Сохраняет исходное форматирование (пробелы, порядок ключей)
  • Медленнее при обработке
  • Требует парсинга при каждом запросе
SELECT '{"name": "Alice", "age": 30}'::json AS data;

JSONB — бинарный формат

  • Хранится в оптимизированном бинарном формате
  • Удаляет пробелы, переупорядочивает ключи
  • Быстрее при обработке
  • Поддерживает индексы
  • Рекомендуется использовать в новых проектах
SELECT '{"name": "Alice", "age": 30}'::jsonb AS data;

Сравнительная таблица

ПараметрJSONJSONB
Формат храненияТекстБинарный
ПарсингПри каждом запросеПри вставке
ПроизводительностьМедленнееБыстрее
Размер на дискеБольшеМеньше
ИндексыНетДа (GIN)
ИспользованиеРедкоСтандарт

Практический пример на Python

import psycopg2
import json

conn = psycopg2.connect("dbname=mydb user=postgres")
cursor = conn.cursor()

# Создать таблицу
cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        profile JSONB
    );
""")

# Вставить данные
user_data = {"name": "Alice", "age": 30}
cursor.execute(
    "INSERT INTO users (profile) VALUES (%s)",
    (json.dumps(user_data),)
)
conn.commit()

SQL примеры

JSONB (рекомендуется)

CREATE INDEX idx_users_name ON users USING GIN (profile);

SELECT * FROM users WHERE profile->>'name' = 'Alice';

SELECT * FROM users WHERE profile @> '{"status": "active"}';

Вывод

Используйте JSONB — это быстрее, поддерживает индексы и оптимизирует память. JSON используется редко и только для особых случаев, когда нужно сохранить исходное форматирование.