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 2 tipos

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();

CHAR(n) (Texto de Tamanho Fixo)

⭐ Essencial 💾 Fixo: n caracteres (em ASCII/latin1 = n bytes; em utf8mb4 = n até 4*n bytes)

Texto de comprimento EXATO e fixo para siglas (UF), CPF, CNPJ, CEP, códigos ISO e hashes.

O tipo CHAR(n) reserva espaço fixo para exatamente `n` caracteres. Não gasta byte extra para gravar o comprimento da string e oferece leitura e indexação ligeiramente mais rápidas quando todos os valores possuem sempre a mesma quantidade de caracteres.

Limites de Capacidade: De 0 até 255 caracteres

✅ Quando Usar (Casos Ideais)

  • • Sigla de Estado / UF (`CHAR(2)` -> `SP`, `RJ`, `MG`).
  • • Código ISO de País ou Moeda (`CHAR(2)` -> `BR`, `US` ou `CHAR(3)` -> `BRL`, `USD`).
  • • CPF sem pontuação (`CHAR(11)`), CNPJ sem pontuação (`CHAR(14)`), CEP sem traço (`CHAR(8)`).
  • • Hashes hexadecimais de tamanho fixo: SHA-256 (`CHAR(64)`), MD5 (`CHAR(32)`), UUID (`CHAR(36)`).

🚫 Quando NÃO Usar (Armadilhas)

  • • Nomes de pessoas, endereços ou textos cujo tamanho varia bastante (desperdiça espaço — use `VARCHAR`).

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: CHAR
Size / Values: Ex: 2 (UF), 8 (CEP), 11 (CPF), 14 (CNPJ), 64 (SHA-256)
Default sugerido: Ex: BR (para país) ou BRL (para moeda)
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB CHAR(11)
PostgreSQL CHAR(11)
SQLite TEXT

📋 Exemplos Reais de Colunas com CHAR:

cpf
CHAR(11) NOT NULL UNIQUE
CPF apenas dígitos (ex: 01234567890)
uf
CHAR(2) NOT NULL
Sigla do estado (ex: SP)
cep
CHAR(8) NOT NULL
CEP apenas dígitos (ex: 01310100)
moeda
CHAR(3) NOT NULL DEFAULT 'BRL'
Código ISO 4217 da moeda
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE enderecos_faturamento (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cliente_id BIGINT UNSIGNED NOT NULL,
    cpf CHAR(11) NOT NULL UNIQUE,
    cep CHAR(8) NOT NULL,
    uf CHAR(2) NOT NULL,
    pais CHAR(2) NOT NULL DEFAULT 'BR'
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

// Higienizando CPF e CEP no PHP (removendo pontos e traços antes de salvar em CHAR)
$cpfBruto = '123.456.789-01';
$cepBruto = '01310-100';
$ufBruta  = 'sp';

$cpf = preg_replace('/\D/', '', $cpfBruto); // "12345678901" (11 dígitos)
$cep = preg_replace('/\D/', '', $cepBruto); // "01310100" (8 dígitos)
$uf  = strtoupper(trim($ufBruta));          // "SP" (2 letras)

if (strlen($cpf) !== 11 || strlen($cep) !== 8 || strlen($uf) !== 2) {
    throw new InvalidArgumentException('Dados com tamanho incorreto para os campos CHAR.');
}

$stmt = $pdo->prepare('
    INSERT INTO enderecos_faturamento (cliente_id, cpf, cep, uf)
    VALUES (:cliente_id, :cpf, :cep, :uf)
');
$stmt->bindValue(':cliente_id', 1, PDO::PARAM_INT);
$stmt->bindValue(':cpf', $cpf, PDO::PARAM_STR);
$stmt->bindValue(':cep', $cep, PDO::PARAM_STR);
$stmt->bindValue(':uf', $uf, PDO::PARAM_STR);
$stmt->execute();