← Voltar para 1. Identificadores & Chaves
1. Identificadores & Chaves

UUID (CHAR(36) / UUID Nativo)

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

💾 Espaço em Disco: 36 Bytes em CHAR(36) no MySQL | 16 Bytes no tipo nativo UUID do PostgreSQL 📏 Limites: Exatamente 36 caracteres (32 dígitos hexadecimais + 4 hífens)

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.

✅ Quando Usar

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

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

📐 Configuração no DrawDB

Type:
CHAR (no MySQL) ou UUID (no PostgreSQL)
Size / Values:
36 (quando usar CHAR)
Default:
UUID() no MySQL 8+ ou gen_random_uuid() no PostgreSQL
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
🗄️ SQL DDL (Pronto para Importar no DrawDB)
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
);
🐘 Exemplo Prático em 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();