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

CHAR(n) (Texto de Tamanho Fixo)

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

💾 Espaço em Disco: Fixo: n caracteres (em ASCII/latin1 = n bytes; em utf8mb4 = n até 4*n bytes) 📏 Limites: De 0 até 255 caracteres

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.

✅ Quando Usar

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

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

📐 Configuração no DrawDB

Type:
CHAR
Size / Values:
Ex: 2 (UF), 8 (CEP), 11 (CPF), 14 (CNPJ), 64 (SHA-256)
Default:
Ex: BR (para país) ou BRL (para moeda)
MySQL / MariaDB
CHAR(11)
PostgreSQL
CHAR(11)
SQLite
TEXT
🗄️ SQL DDL (Pronto para Importar no DrawDB)
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'
);
🐘 Exemplo Prático em 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();