← Voltar para 10. Binários & Hashes Brutos
10. Binários & Hashes Brutos

BINARY / VARBINARY / BLOB (Dados Binários)

Armazena bytes brutos sem codificação de caracteres (chaves criptográficas, UUID binário, certificados).

💾 Espaço em Disco: BINARY(16): 16 Bytes | BLOB: até 64 KB | MEDIUMBLOB: até 16 MB | LONGBLOB: até 4 GB 📏 Limites: Bytes puros sem conversão de charset

`BINARY(n)` e `VARBINARY(n)` funcionam exatamente como `CHAR` e `VARCHAR`, mas guardam bytes puros em vez de caracteres de texto (sem collation). Já `BLOB` (Binary Large Object) guarda arquivos binários maiores. REGRA DE OURO DA ARQUITETURA: Evite salvar fotos de produtos, PDFs ou vídeos dentro de colunas `BLOB` no banco! Salve os arquivos no disco ou em Object Storage (Amazon S3, Cloudflare R2, MinIO) e grave apenas o caminho/URL em um `VARCHAR(255)` no banco.

✅ Quando Usar

  • •`BINARY(16)`: Armazenar UUID compactado em 16 bytes (`UUID_TO_BIN` no MySQL 8) ou endereços IPv4/IPv6 com `inet_pton()` do PHP (`VARBINARY(16)`).
  • •`VARBINARY` / `BLOB`: Certificados digitais A1 (`.pfx`) criptografados, chaves criptográficas pequenas ou assinaturas digitais.

🚫 Quando NÃO Usar

  • •Fotos de usuários, imagens de produtos, vídeos ou relatórios em PDF — eles inflam o backup do banco de dados e esgotam a memória RAM de cache (Buffer Pool). Use `VARCHAR(255)` com a URL do arquivo!

📐 Configuração no DrawDB

Type:
VARBINARY ou BLOB
Size / Values:
16 (para IP ou UUID binário em VARBINARY)
Default:
Vazio
MySQL / MariaDB
BINARY(16), VARBINARY(255) ou BLOB
PostgreSQL
BYTEA (ou tipo INET nativo para endereços IP)
SQLite
BLOB
🗄️ SQL DDL (Pronto para Importar no DrawDB)
CREATE TABLE sessoes_seguranca (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NOT NULL,
    ip_endereco VARBINARY(16) NOT NULL COMMENT 'IPv4 ou IPv6 compactado via inet_pton',
    token_hash BINARY(32) NOT NULL COMMENT 'SHA-256 binário puro de 32 bytes'
);
🐘 Exemplo Prático em PHP 8 + PDO
<?php
declare(strict_types=1);

// Armazenando endereço IP (IPv4 ou IPv6) em VARBINARY(16) via inet_pton() do PHP
$ipCliente = '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
$ipBinario = inet_pton($ipCliente); // Converte para 16 bytes binários

// Hash SHA-256 binário puro (32 bytes em vez de 64 caracteres hexadecimais)
$tokenHashBinario = hash('sha256', 'token-secreto-do-usuario', true);

$stmt = $pdo->prepare('
    INSERT INTO sessoes_seguranca (usuario_id, ip_endereco, token_hash)
    VALUES (:usuario_id, :ip, :token)
');
$stmt->bindValue(':usuario_id', 1, PDO::PARAM_INT);
$stmt->bindValue(':ip', $ipBinario, PDO::PARAM_LOB);
$stmt->bindValue(':token', $tokenHashBinario, PDO::PARAM_LOB);
$stmt->execute();

// Para converter de volta dos bytes para string de IP legível no PHP:
$ipLegivel = inet_ntop($ipBinario);