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.

✕

4. Textos Curtos & Variáveis 1 tipo

Campos de texto de tamanho fixo (CHAR) ou variável (VARCHAR) para nomes, e-mails, CPFs, telefones, siglas e hashes.

VARCHAR(n) (Texto de Tamanho Variável)

⭐ Essencial 💾 Tamanho real da string em bytes + 1 byte (até 255) ou + 2 bytes (> 255)

O campo de texto mais usado do banco de dados: armazena apenas os caracteres digitados + 1 ou 2 bytes de tamanho.

Diferente do CHAR, o VARCHAR(n) ocupa apenas o espaço real do texto armazenado mais 1 byte de controle (se n <= 255) ou 2 bytes (se n > 255). O número `n` define a quantidade MÁXIMA de caracteres permitidos (não de bytes!). Em `utf8mb4`, cada caractere pode usar de 1 a 4 bytes. Mesmo que o espaço em disco seja dinâmico, definir um limite `n` realista (ex: `VARCHAR(120)` em vez de `VARCHAR(255)` em tudo) economiza memória RAM, pois o MySQL aloca buffers em memória com base no tamanho máximo declarado durante ordenações (`ORDER BY`) e tabelas temporárias!

Limites de Capacidade: De 1 até 16.383 caracteres em utf8mb4 (limite de 65.535 bytes por linha no MySQL)

✅ Quando Usar (Casos Ideais)

  • • Nomes de pessoas, razões sociais, títulos de produtos (`VARCHAR(100)` a `VARCHAR(180)`).
  • • Endereços de e-mail (`VARCHAR(150)` ou `VARCHAR(254)` conforme RFC).
  • • Senhas criptografadas com `password_hash()` do PHP (Bcrypt/Argon2id) -> use `VARCHAR(255)`.
  • • Telefones com DDI/DDD (`VARCHAR(20)`), URLs (`VARCHAR(500)`), Slugs (`VARCHAR(160)`).

🚫 Quando NÃO Usar (Armadilhas)

  • • Códigos cujo tamanho é SEMPRE idêntico em 100% dos registros, como UF (`SP`, `RJ` -> 2 caracteres) ou CPF sem máscara (`11` dígitos) — nesses casos, prefira `CHAR`.
  • • Textos imensos sem limite previsível como corpo de matérias ou artigos completos — use `TEXT`.

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: VARCHAR
Size / Values: Ex: 100 (nome), 150 (email), 255 (senha_hash), 20 (telefone)
Default sugerido: Vazio ou string padrão
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB VARCHAR(150)
PostgreSQL VARCHAR(150)
SQLite TEXT (SQLite trata VARCHAR como afinidade TEXT)

📋 Exemplos Reais de Colunas com VARCHAR:

nome_completo
VARCHAR(120) NOT NULL
Nome do cliente ou usuário
email
VARCHAR(150) NOT NULL UNIQUE
E-mail de login único
senha_hash
VARCHAR(255) NOT NULL
Hash gerado por password_hash() no PHP
telefone
VARCHAR(20) NULL
Telefone celular / WhatsApp (ex: +5511999998888)
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE clientes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nome_completo VARCHAR(120) NOT NULL,
    email VARCHAR(150) NOT NULL UNIQUE,
    senha_hash VARCHAR(255) NOT NULL,
    telefone VARCHAR(20) NULL,
    cidade VARCHAR(80) NOT NULL
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

$nome  = trim($_POST['nome'] ?? '');
$email = trim($_POST['email'] ?? '');
$senha = $_POST['senha'] ?? '';

// 1. Validação do comprimento em caracteres UTF-8 com mb_strlen()
if ($nome === '' || mb_strlen($nome, 'UTF-8') > 120) {
    throw new InvalidArgumentException('O nome deve ter entre 1 e 120 caracteres.');
}

// 2. Validação nativa de e-mail e limite do VARCHAR(150)
if (!filter_var($email, FILTER_VALIDATE_EMAIL) || mb_strlen($email, 'UTF-8') > 150) {
    throw new InvalidArgumentException('E-mail inválido.');
}

// 3. Hash seguro de senha no PHP (sempre cabe em VARCHAR(255))
$senhaHash = password_hash($senha, PASSWORD_DEFAULT);

$stmt = $pdo->prepare('
    INSERT INTO clientes (nome_completo, email, senha_hash)
    VALUES (:nome, :email, :senha_hash)
');
$stmt->bindValue(':nome', $nome, PDO::PARAM_STR);
$stmt->bindValue(':email', mb_strtolower($email, 'UTF-8'), PDO::PARAM_STR);
$stmt->bindValue(':senha_hash', $senhaHash, PDO::PARAM_STR);
$stmt->execute();