Referência Completa de Tipos de Dados SQL

Manual de Todos os Campos do Banco de Dados

Explore cada tipo de campo (VARCHAR, CHAR, INT, DECIMAL, TIMESTAMP, JSON, ENUM...) agrupado por funcionalidade, como configurar no DrawDB e como validar e gravar com PHP 8 + PDO.

✕

2. Numéricos Inteiros 3 tipos

Números sem casas decimais para contagens, quantidades em estoque, idades, ordenação e códigos numéricos.

TINYINT / TINYINT UNSIGNED

⭐ Essencial 💾 1 Byte (8 bits)

Inteiro super compacto de 1 Byte (0 a 255 sem sinal, ou -128 a 127 com sinal).

É o menor tipo numérico inteiro do banco de dados, consumindo apenas 1 byte por linha. Excelente para armazenar números pequenos cujos limites são bem conhecidos, como idade de uma pessoa, dia do mês (1 a 31), nota de avaliação (1 a 5 estrelas), número de parcelas de cartão (1 a 24) ou códigos de status.

Limites de Capacidade: Unsigned: 0 a 255 | Signed: -128 a 127

✅ Quando Usar (Casos Ideais)

  • • Idade de usuários (0 a 150 anos cabe com folga em `TINYINT UNSIGNED`).
  • • Avaliações/Ratings de produtos (1 a 5 estrelas ou 0 a 10).
  • • Mês do ano (1 a 12), dia da semana (1 a 7), número de parcelas (1 a 48).
  • • Prioridade ou nível de permissão numérico simples.

🚫 Quando NÃO Usar (Armadilhas)

  • • Quantidades de estoque ou contadores de visualizações que podem facilmente passar de 255.
  • • No PostgreSQL não existe `TINYINT` nativo (use `SMALLINT` no Postgres).

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: TINYINT (MySQL/MariaDB) ou SMALLINT (PostgreSQL)
Size / Values: Vazio
Default sugerido: Ex: 0 ou 1
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB TINYINT UNSIGNED
PostgreSQL SMALLINT (2 bytes)
SQLite INTEGER

📋 Exemplos Reais de Colunas com TINYINT:

idade
TINYINT UNSIGNED NULL
Idade do cliente (0 a 255)
estrelas
TINYINT UNSIGNED NOT NULL
Nota da avaliação de 1 a 5
parcelas
TINYINT UNSIGNED NOT NULL DEFAULT 1
Quantidade de parcelas do pagamento
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE avaliacoes_produto (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    produto_id INT UNSIGNED NOT NULL,
    estrelas TINYINT UNSIGNED NOT NULL COMMENT 'Nota de 1 a 5',
    comentario VARCHAR(500) NULL,
    CONSTRAINT chk_estrelas CHECK (estrelas BETWEEN 1 AND 5)
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

$estrelas = filter_input(INPUT_POST, 'estrelas', FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 5]
]);

if ($estrelas === false || $estrelas === null) {
    throw new DomainException('A nota deve ser um número inteiro entre 1 e 5.');
}

$stmt = $pdo->prepare('
    INSERT INTO avaliacoes_produto (produto_id, estrelas, comentario)
    VALUES (:produto_id, :estrelas, :comentario)
');
$stmt->bindValue(':produto_id', 42, PDO::PARAM_INT);
$stmt->bindValue(':estrelas', $estrelas, PDO::PARAM_INT);
$stmt->bindValue(':comentario', 'Excelente produto!', PDO::PARAM_STR);
$stmt->execute();

SMALLINT / SMALLINT UNSIGNED

💾 2 Bytes (16 bits)

Inteiro de 2 Bytes para faixas intermediárias (0 a 65.535 sem sinal).

Ocupa metade do espaço de um INT comum (2 bytes). É ideal para quantidades moderadas que passam de 255 mas nunca chegarão a 65 mil, como ano de fabricação de veículos, número de páginas de um livro, portas de rede TCP/IP (1 a 65535) ou ordem de exibição de itens em menus e galerias.

Limites de Capacidade: Unsigned: 0 a 65.535 | Signed: -32.768 a 32.767

✅ Quando Usar (Casos Ideais)

  • • Número de páginas de um livro, duração de um filme em minutos.
  • • Ano histórico ou ano modelo de veículo (ex: 1850 a 2150).
  • • Porta de servidor de rede (0 a 65535).
  • • Quantidade de itens por pedido no carrinho de compras.

🚫 Quando NÃO Usar (Armadilhas)

  • • Estoque de produtos em atacado ou visualizações de página que possam ultrapassar 65.535.

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: SMALLINT
Size / Values: Vazio
Default sugerido: Ex: 0 ou 1
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB SMALLINT UNSIGNED
PostgreSQL SMALLINT
SQLite INTEGER

📋 Exemplos Reais de Colunas com SMALLINT:

ano_fabricacao
SMALLINT UNSIGNED NOT NULL
Ano do veículo (ex: 2026)
numero_paginas
SMALLINT UNSIGNED NULL
Total de páginas de um livro
ordem_exibicao
SMALLINT UNSIGNED NOT NULL DEFAULT 0
Ordenação de banners/menus
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE livros (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    titulo VARCHAR(180) NOT NULL,
    ano_publicacao SMALLINT UNSIGNED NOT NULL,
    numero_paginas SMALLINT UNSIGNED NOT NULL
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

$paginas = 384;
$ano = 2026;

if ($paginas < 1 || $paginas > 65535) {
    throw new RangeException('Número de páginas fora do limite de SMALLINT.');
}

$stmt = $pdo->prepare('
    INSERT INTO livros (titulo, ano_publicacao, numero_paginas)
    VALUES (:titulo, :ano, :paginas)
');
$stmt->bindValue(':titulo', 'Arquitetura de Bancos de Dados em PHP', PDO::PARAM_STR);
$stmt->bindValue(':ano', $ano, PDO::PARAM_INT);
$stmt->bindValue(':paginas', $paginas, PDO::PARAM_INT);
$stmt->execute();

INT / INTEGER (Com e Sem Sinal)

⭐ Essencial 💾 4 Bytes (32 bits)

O tipo inteiro padrão de 4 Bytes para quantidades de estoque, contadores, pontos e durações em segundos.

Quando não usado como chave primária, o INT (ou INTEGER) é o cavalo de batalha para números inteiros do dia a dia. Se o valor nunca puder ser negativo (como visualizações de vídeo, tempo em segundos), marque como UNSIGNED no MySQL ou adicione uma restrição CHECK (valor >= 0). Se puder ficar negativo (como saldo de pontos de fidelidade ou ajuste de estoque), mantenha SIGNED.

Limites de Capacidade: Signed: -2.147.483.648 a +2.147.483.647 | Unsigned: 0 a 4.294.967.295

✅ Quando Usar (Casos Ideais)

  • • Quantidade de produtos em estoque (`estoque_atual INT NOT NULL DEFAULT 0`).
  • • Contador de acessos, curtidas, downloads ou duração de vídeo em segundos.
  • • Armazenar valores monetários em centavos caso a equipe adote o padrão Money Pattern (ex: R$ 19,90 = 1990 centavos).

🚫 Quando NÃO Usar (Armadilhas)

  • • NUNCA use INT para armazenar CPF, CNPJ, CEP ou Telefone! Números de documentos e telefones começam com zero (`01234567890`) e o INT apaga os zeros à esquerda, além de estourar o limite de 32 bits em CNPJs e telefones com DDI.

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: INT ou INTEGER
Size / Values: Vazio
Default sugerido: 0
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB INT (ou INT UNSIGNED)
PostgreSQL INTEGER
SQLite INTEGER

📋 Exemplos Reais de Colunas com INT:

quantidade_estoque
INT NOT NULL DEFAULT 0
Saldo atual de unidades no estoque
duracao_segundos
INT UNSIGNED NOT NULL
Tempo de duração de uma aula em vídeo
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE estoque_produtos (
    produto_id INT UNSIGNED PRIMARY KEY,
    quantidade_disponivel INT NOT NULL DEFAULT 0,
    quantidade_reservada INT UNSIGNED NOT NULL DEFAULT 0,
    atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

// Atualização atômica de estoque no banco via PDO
$produtoId = 10;
$qtdComprada = 3;

$stmt = $pdo->prepare('
    UPDATE estoque_produtos
    SET quantidade_disponivel = quantidade_disponivel - :qtd
    WHERE produto_id = :id AND quantidade_disponivel >= :qtd
');
$stmt->bindValue(':qtd', $qtdComprada, PDO::PARAM_INT);
$stmt->bindValue(':id', $produtoId, PDO::PARAM_INT);
$stmt->execute();

if ($stmt->rowCount() === 0) {
    throw new RuntimeException('Estoque insuficiente para concluir a reserva.');
}