← Voltar para 4. Textos Curtos & Variáveis
4. Textos Curtos & Variáveis

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

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

💾 Espaço em Disco: Tamanho real da string em bytes + 1 byte (até 255) ou + 2 bytes (> 255) 📏 Limites: De 1 até 16.383 caracteres em utf8mb4 (limite de 65.535 bytes por linha no MySQL)

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!

✅ Quando Usar

  • •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

  • •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`.

📐 Configuração no DrawDB

Type:
VARCHAR
Size / Values:
Ex: 100 (nome), 150 (email), 255 (senha_hash), 20 (telefone)
Default:
Vazio ou string padrão
MySQL / MariaDB
VARCHAR(150)
PostgreSQL
VARCHAR(150)
SQLite
TEXT (SQLite trata VARCHAR como afinidade TEXT)
🗄️ SQL DDL (Pronto para Importar no DrawDB)
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
);
🐘 Exemplo Prático em 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();