Guia Completo de Decisão (A vs B vs C)
⚡ Abrir Lista Compacta de Todos os Comandos & Tipos →

Todos os Tipos SQL: Para que servem, Onde usar e O que muda entre A, B ou C

Consulte todos os tipos de campos do banco de dados organizados por categoria funcional. Entenda exatamente para que serve cada tipo, onde aplicar no seu projeto e o que muda na prática se você escolher o tipo A, B ou C na hora de desenhar no DrawDB e programar em PHP.

5. Booleanos, Listas de Opções (ENUM/SET) e Documentos JSON

Para flags de verdadeiro/falso, status de pedidos, níveis de acesso e configurações flexíveis.

5 Tipos SQL nesta categoria

⚖️ O que muda se eu usar (A) ENUM, (B) VARCHAR com Enum no PHP ou (C) Tabela Separada (FK)?

Comparativo de Impacto Real (A vs B vs C)
A ENUM('pendente', 'pago', 'cancelado')

Opção A: Usar ENUM no Banco

🔄 O que muda no banco: O próprio banco de dados trava os valores permitidos e grava internamente como um número de 1 byte (super compacto).
✅ Vantagem: Impede que qualquer script grave um status inválido no banco e ocupa apenas 1 byte por linha.
⚠️ Cuidado / Limitação: Para adicionar ou remover uma opção no futuro, você precisa rodar um `ALTER TABLE` na estrutura do banco.
🎯 Use para listas pequenas e imutáveis (ex: PF/PJ, status básicos do sistema).
B Flexibilidade de Código sem ALTER TABLE

Opção B: Usar VARCHAR(30) + BackedEnum no PHP 8

🔄 O que muda no banco: A coluna no banco é um `VARCHAR(30) NOT NULL`, e quem valida as opções permitidas é o `enum Status: string` nativo do PHP 8.1+.
✅ Vantagem: Se surgir um novo status amanhã, basta adicionar 1 linha no Enum do PHP sem precisar alterar a tabela no banco de dados!
⚠️ Cuidado / Limitação: Ocupa alguns bytes a mais no disco (o tamanho da palavra em vez de 1 byte).
🎯 Excelente para projetos ágeis em PHP 8 onde novos status surgem com frequência.
C tabela_id INT UNSIGNED (Relacional)

Opção C: Criar uma Tabela Separada com Foreign Key

🔄 O que muda no banco: As opções ficam cadastradas como linhas em uma tabela própria (ex: `categorias` ou `departamentos`) e são ligadas por chave estrangeira.
✅ Vantagem: O próprio cliente/administrador pode criar, renomear ou desativar opções pelo painel do sistema sem mexer em código nem banco!
⚠️ Cuidado / Limitação: Exige um `JOIN` na hora de buscar o nome da opção.
🎯 Obrigatório sempre que o usuário puder cadastrar novas opções pelo sistema!
BOOLEAN / BOOL / TINYINT(1) 📐 DrawDB: BOOLEAN (ou TINYINT Size: 1)
💾 1 Byte — Valores: 0 (Falso) ou 1 (Verdadeiro)

📌 Para que serve este Tipo SQL:

Guardar respostas de Sim/Não, Ativo/Inativo, Ligado/Desligado.

📍 Onde posso usar:

  • • Cadastro ativo (`ativo BOOLEAN NOT NULL DEFAULT 1`)
  • • Produto em destaque (`destaque BOOLEAN NOT NULL DEFAULT 0`)
  • • Frete grátis (`frete_gratis BOOLEAN NOT NULL DEFAULT 0`)

⚖️ O que muda se eu escolher este?

Ocupa apenas 1 byte e torna os filtros no PHP super limpos. Dica: se além de saber SE foi feito você precisar saber QUANDO foi feito (ex: e-mail verificado), troque `email_verificado BOOLEAN` por `email_verificado_em TIMESTAMP NULL`!

🐘 PHP PDO: No PDO, envie `$ativo ? 1 : 0` com `PDO::PARAM_INT` para total compatibilidade.
Ver código SQL/PHP →
BIT(n) 📐 DrawDB: BIT | Size: 1 a 64
💾 Aproximadamente (n + 7) / 8 Bytes

📌 Para que serve este Tipo SQL:

Armazenar máscaras de bits puras (flags binárias compactadas).

📍 Onde posso usar:

  • • Sistemas legados ou máscaras de permissões binárias (b'0101').

⚖️ O que muda se eu escolher este?

Se escolher `BIT(1)` em vez de `BOOLEAN`/`TINYINT(1)` no MySQL, o PDO em PHP pode retornar o valor como um caractere binário invisível (`"\x00"` ou `"\x01"`), causando bugs em `if ($row['ativo'])`! Por isso, prefira sempre `BOOLEAN` / `TINYINT(1)` no MySQL.

🐘 PHP PDO: Evite BIT(1) em PHP; use BOOLEAN / TINYINT(1).
Ver código SQL/PHP →
ENUM('a', 'b', 'c') 📐 DrawDB: ENUM | Values: 'pendente','pago','cancelado'
💾 1 Byte (até 255 opções) ou 2 Bytes

📌 Para que serve este Tipo SQL:

Permitir que a coluna receba exatamente UM valor dentre uma lista fechada.

📍 Onde posso usar:

  • • Status de pedido: ENUM('pendente', 'pago', 'enviado', 'cancelado')
  • • Tipo de pessoa: ENUM('PF', 'PJ')
  • • Método de pagamento: ENUM('pix', 'cartao', 'boleto')

⚖️ O que muda se eu escolher este?

O banco valida automaticamente a opção enviada e economiza espaço gravando apenas o índice numérico internamente.

🐘 PHP PDO: Combine com `enum MeuStatus: string` do PHP 8.1+.
Ver código SQL/PHP →
SET('a', 'b', 'c') 📐 DrawDB: SET | Values: 'seg','ter','qua','qui','sex'
💾 1 a 8 Bytes (até 64 opções combináveis)

📌 Para que serve este Tipo SQL:

Permitir escolher ZERO, UM ou VÁRIOS valores ao mesmo tempo de uma lista pré-definida.

📍 Onde posso usar:

  • • Dias da semana de um alarme ou características simples fixas.

⚖️ O que muda se eu escolher este?

Difícil de filtrar individualmente e só existe no MySQL. Na prática moderna, é muito melhor usar uma coluna `JSON` (ex: `["seg", "qua"]`) ou uma tabela relacional N:N!

🐘 PHP PDO: Prefira JSON ou tabela associativa N:N em vez de SET.
Ver código SQL/PHP →
JSON / JSONB 📐 DrawDB: JSON (ou JSONB no PostgreSQL)
💾 Variável em formato binário otimizado (até 1 GB / 4 GB)

📌 Para que serve este Tipo SQL:

Guardar arrays, objetos aninhados e atributos variáveis sem precisar criar dezenas de colunas vazias.

📍 Onde posso usar:

  • • Ficha técnica variável de produtos (ex: especificações de celular vs roupa)
  • • Preferências de interface do usuário, logs de auditoria (valores antigos vs novos)
  • • Retorno bruto de gateways de pagamento (Webhooks)

⚖️ O que muda se eu escolher este?

Se escolher `JSON` em vez de `TEXT`, o banco impede salvar um JSON com erro de sintaxe e permite consultar campos internos direto no SQL (`WHERE atributos->>"$.voltagem" = "220v"`). Mas nunca use JSON para guardar chaves estrangeiras!

🐘 PHP PDO: Use `json_encode($dados, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)` e `json_decode($json, true)`.
Ver código SQL/PHP →