← Назад к вопросам
В чем разница между 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;
Сравнительная таблица
| Параметр | JSON | JSONB |
|---|---|---|
| Формат хранения | Текст | Бинарный |
| Парсинг | При каждом запросе | При вставке |
| Производительность | Медленнее | Быстрее |
| Размер на диске | Больше | Меньше |
| Индексы | Нет | Да (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 используется редко и только для особых случаев, когда нужно сохранить исходное форматирование.