BINARY / VARBINARY / BLOB (Dados Binários)
💾 BINARY(16): 16 Bytes | BLOB: até 64 KB | MEDIUMBLOB: até 16 MB | LONGBLOB: até 4 GBArmazena bytes brutos sem codificação de caracteres (chaves criptográficas, UUID binário, certificados).
`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 (Casos Ideais)
- • `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 (Armadilhas)
- • 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!
📐 Como Configurar no DrawDB Abrir DrawDB ↗
BINARY(16), VARBINARY(255) ou BLOB
BYTEA (ou tipo INET nativo para endereços IP)
BLOB
📋 Exemplos Reais de Colunas com VARBINARY:
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'
);
<?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);