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.

1. Identificadores & Chaves 3 tipos

Campos responsáveis por identificar unicamente cada linha (Primary Keys) e conectar tabelas (Foreign Keys), incluindo auto-incremento e UUIDs.

INT UNSIGNED AUTO_INCREMENT

⭐ Essencial 💾 4 Bytes (32 bits)

Chave primária numérica sequencial padrão (1, 2, 3...) ideal para a maioria das tabelas relacionais.

O tipo INT UNSIGNED AUTO_INCREMENT (ou SERIAL no PostgreSQL) gera automaticamente um número inteiro único e sequencial a cada novo registro inserido. Por ocupar apenas 4 bytes e ser inserido em ordem crescente, o índice B-Tree da chave primária permanece extremamente rápido e sem fragmentação em disco.

Limites de Capacidade: De 1 até 4.294.967.295 (Unsigned) ou até 2.147.483.647 (Signed)

✅ Quando Usar (Casos Ideais)

  • • Chave primária (id) de tabelas com até ~2 bilhões de registros (usuários, produtos, categorias, clientes).
  • • Chaves estrangeiras (usuario_id, categoria_id) que apontam para tabelas com PK do tipo INT.
  • • Sistemas internos onde o ID sequencial rápido melhora a performance de JOINs.

🚫 Quando NÃO Usar (Armadilhas)

  • • Tabelas de altíssimo volume que podem ultrapassar 4 bilhões de linhas (logs, eventos de IoT, transações financeiras globais) — nesses casos, use BIGINT.
  • • URLs públicas sensíveis onde você não quer que concorrentes descubram quantos clientes ou pedidos você tem (ex: /pedido/105 vs /pedido/106) — combine com um UUID público.

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: INT (ou INTEGER)
Size / Values: Deixe em branco (não use INT(11), pois no MySQL 8+ o display width foi depreciado)
Default sugerido: Vazio (o banco gera automaticamente via Auto Increment)
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
PostgreSQL SERIAL PRIMARY KEY (ou INT GENERATED ALWAYS AS IDENTITY)
SQLite INTEGER PRIMARY KEY AUTOINCREMENT

📋 Exemplos Reais de Colunas com INT:

id
INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
Identificador único da tabela
categoria_id
INT UNSIGNED NOT NULL
Chave estrangeira (FK) apontando para categorias.id
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE categorias (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(80) NOT NULL
);

CREATE TABLE produtos (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    categoria_id INT UNSIGNED NOT NULL,
    nome VARCHAR(120) NOT NULL,
    CONSTRAINT fk_produtos_categoria
        FOREIGN KEY (categoria_id) REFERENCES categorias(id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

// 1. Inserindo registro sem informar o ID (o banco gera via AUTO_INCREMENT)
$stmt = $pdo->prepare('INSERT INTO categorias (nome) VALUES (:nome)');
$stmt->bindValue(':nome', 'Eletrônicos', PDO::PARAM_STR);
$stmt->execute();

// 2. Recuperando o ID gerado pelo banco convertendo para int do PHP
$novoId = (int) $pdo->lastInsertId();
echo "Categoria criada com ID: {$novoId}\n";

// 3. Buscando por ID com validação e PDO::PARAM_INT
$idBusca = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($idBusca === false || $idBusca === null || $idBusca <= 0) {
    throw new InvalidArgumentException('ID inválido.');
}

$stmt = $pdo->prepare('SELECT id, nome FROM categorias WHERE id = :id');
$stmt->bindValue(':id', $idBusca, PDO::PARAM_INT);
$stmt->execute();
$categoria = $stmt->fetch(PDO::FETCH_ASSOC);

BIGINT UNSIGNED AUTO_INCREMENT

⭐ Essencial 💾 8 Bytes (64 bits)

Chave primária de 64 bits para tabelas massivas (padrão em frameworks modernos como Laravel).

Ocupa o dobro do espaço de um INT (8 bytes em vez de 4), mas permite até 18 quintilhões de registros. Frameworks modernos como Laravel utilizam BIGINT UNSIGNED como padrão (`$table->id()`) para garantir que nenhuma tabela esgote seus IDs, mesmo em sistemas de grande escala.

Limites de Capacidade: De 0 até 18.446.744.073.709.551.615 (Unsigned)

✅ Quando Usar (Casos Ideais)

  • • Tabelas que crescem rapidamente: pedidos, itens_pedido, logs_acesso, mensagens_chat, notificações, movimentações.
  • • Como padrão geral de chave primária caso queira total padronização no banco inteiro.

🚫 Quando NÃO Usar (Armadilhas)

  • • Tabelas auxiliares estáticas minúsculas (ex: estados_brasileiros com 27 linhas), onde `TINYINT` ou `INT` economiza memória em milhões de FKs.
  • • ATENÇÃO NO DRAWDB: Nunca crie uma FK `INT` apontando para uma PK `BIGINT`! O MySQL recusará criar a Foreign Key (Erro 150 / 3780).

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: BIGINT
Size / Values: Vazio
Default sugerido: Vazio
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
PostgreSQL BIGSERIAL PRIMARY KEY
SQLite INTEGER PRIMARY KEY AUTOINCREMENT

📋 Exemplos Reais de Colunas com BIGINT:

id
BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
PK de tabela de alto volume
usuario_id
BIGINT UNSIGNED NOT NULL
FK compatível com usuarios.id (BIGINT)
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE usuarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(150) NOT NULL UNIQUE
);

CREATE TABLE logs_auditoria (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NOT NULL,
    acao VARCHAR(100) NOT NULL,
    criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_logs_usuario
        FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
        ON DELETE CASCADE
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

// Em PHP de 64-bits (padrão atual), o tipo `int` suporta até 9 quintilhões (PHP_INT_MAX).
$usuarioId = 9876543210;

$stmt = $pdo->prepare('
    INSERT INTO logs_auditoria (usuario_id, acao)
    VALUES (:usuario_id, :acao)
');
$stmt->bindValue(':usuario_id', $usuarioId, PDO::PARAM_INT);
$stmt->bindValue(':acao', 'LOGIN_SUCESSO', PDO::PARAM_STR);
$stmt->execute();

$logId = (int) $pdo->lastInsertId();

UUID (CHAR(36) / UUID Nativo)

⭐ Essencial 💾 36 Bytes em CHAR(36) no MySQL | 16 Bytes no tipo nativo UUID do PostgreSQL

Identificador universalmente único de 36 caracteres (ex: 550e8400-e29b-41d4-a716-446655440000).

UUIDs permitem gerar identificadores únicos diretamente no PHP antes mesmo de consultar o banco de dados, além de ocultar a contagem real de registros em URLs e APIs REST. Dica de ouro: prefira UUID v7 (ordenado por tempo) em vez de UUID v4 (totalmente aleatório) para evitar fragmentação de índices B-Tree.

Limites de Capacidade: Exatamente 36 caracteres (32 dígitos hexadecimais + 4 hífens)

✅ Quando Usar (Casos Ideais)

  • • IDs públicos expostos em URLs, APIs, links de pagamento ou notas fiscais (`/faturas/0192a4b2-7c90-...`).
  • • Sistemas distribuídos ou aplicativos offline que geram o ID antes de sincronizar com o servidor.
  • • Como coluna secundária (`uuid CHAR(36) UNIQUE`) mantendo `id BIGINT` interno para JOINs rápidos (Padrão Híbrido Recomendado!).

🚫 Quando NÃO Usar (Armadilhas)

  • • Não use `VARCHAR(36)` para UUID — como todo UUID com hífens tem exatamente 36 caracteres, `CHAR(36)` é mais rápido e não gasta byte extra de prefixo.
  • • Evite UUID v4 como Primary Key clusterizada no MySQL InnoDB em tabelas com milhões de linhas (prefira UUID v7 ou o padrão híbrido ID numérico + coluna UUID).

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: CHAR (no MySQL) ou UUID (no PostgreSQL)
Size / Values: 36 (quando usar CHAR)
Default sugerido: UUID() no MySQL 8+ ou gen_random_uuid() no PostgreSQL
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB CHAR(36) NOT NULL UNIQUE (MariaDB 10.7+ possui tipo UUID nativo)
PostgreSQL UUID NOT NULL DEFAULT gen_random_uuid()
SQLite TEXT NOT NULL UNIQUE

📋 Exemplos Reais de Colunas com CHAR(36):

uuid
CHAR(36) NOT NULL UNIQUE
Identificador público seguro para expor na URL/API
transacao_externa_id
CHAR(36) NOT NULL
Chave de idempotência para evitar cobrança duplicada
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE pedidos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    uuid CHAR(36) NOT NULL UNIQUE,
    valor_total DECIMAL(10, 2) NOT NULL,
    criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

/**
 * Gerador nativo de UUID v4 em PHP 8+ (sem precisar de bibliotecas externas)
 */
function gerarUuidV4(): string {
    $bytes = random_bytes(16);
    $bytes[6] = chr((ord($bytes[6]) & 0x0f) | 0x40); // Versão 4
    $bytes[8] = chr((ord($bytes[8]) & 0x3f) | 0x80); // Variante RFC 4122
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
}

/**
 * Validando se uma string recebida na URL é um UUID válido
 */
function validarUuid(string $uuid): bool {
    return (bool) preg_match(
        '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i',
        $uuid
    );
}

$uuid = gerarUuidV4();
$stmt = $pdo->prepare('INSERT INTO pedidos (uuid, valor_total) VALUES (:uuid, :total)');
$stmt->bindValue(':uuid', $uuid, PDO::PARAM_STR);
$stmt->bindValue(':total', '149.90', PDO::PARAM_STR);
$stmt->execute();