JSON / JSONB (Documentos Estruturados)
⭐ Essencial 💾 Aproximadamente o tamanho de um LONGBLOB/LONGTEXT (até 1 GB no Postgres / 4 GB no MySQL)Armazena objetos e arrays JSON validados automaticamente e consultáveis via SQL.
O tipo nativo `JSON` (MySQL 5.7.8+ / MariaDB) e `JSONB` (PostgreSQL) valida automaticamente se a string enviada é um JSON válido e a armazena em um formato binário otimizado que permite buscar chaves específicas (`JSON_EXTRACT` ou operador `->`) sem precisar ler e fazer parse do texto inteiro.
✅ Quando Usar (Casos Ideais)
- • Atributos dinâmicos de produtos de categorias muito diferentes (ex: ficha técnica de uma Camiseta vs Placa de Vídeo).
- • Preferências e configurações de interface do usuário (tema escuro, notificações, idioma).
- • Payloads brutos de Webhooks (Stripe, Mercado Pago, Asaas) e snapshots de auditoria (antes/depois da edição).
🚫 Quando NÃO Usar (Armadilhas)
- • NÃO use JSON como muleta para evitar criar tabelas e relacionamentos normais! Nunca guarde chaves estrangeiras dentro de um array JSON (`"produtos_ids": [1, 5, 9]`) — crie uma tabela associativa!
📐 Como Configurar no DrawDB Abrir DrawDB ↗
JSON
JSONB (Binário indexável recomendado) ou JSON
TEXT (com funções da extensão JSON1 nativas)
📋 Exemplos Reais de Colunas com JSON:
CREATE TABLE produtos_catalogo (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(150) NOT NULL,
preco DECIMAL(10, 2) NOT NULL,
atributos_extras JSON NULL COMMENT 'Ex: {"voltagem": "220v", "garantia_meses": 12}'
);
<?php
declare(strict_types=1);
// 1. Codificando array associativo do PHP para JSON com tratamento de erro nativo (JSON_THROW_ON_ERROR)
$atributos = [
'processador' => 'Ryzen 7',
'memoria_ram_gb' => 32,
'conexoes' => ['HDMI 2.1', 'USB-C', 'Wi-Fi 6E'],
];
$jsonString = json_encode($atributos, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
$stmt = $pdo->prepare('
INSERT INTO produtos_catalogo (nome, preco, atributos_extras)
VALUES (:nome, :preco, :atributos)
');
$stmt->bindValue(':nome', 'Notebook Pro 16', PDO::PARAM_STR);
$stmt->bindValue(':preco', '7499.90', PDO::PARAM_STR);
$stmt->bindValue(':atributos', $jsonString, PDO::PARAM_STR);
$stmt->execute();
// 2. Lendo do banco e decodificando de volta para Array PHP
$dadosAtributos = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR);
echo $dadosAtributos['processador']; // "Ryzen 7"