Referência Completa de Tipos de Dados SQL

Manual de Todos os Campos do Banco de Dados

Explore cada tipo de campo (VARCHAR, CHAR, INT, DECIMAL, TIMESTAMP, JSON, ENUM...) agrupado por funcionalidade, como configurar no DrawDB e como validar e gravar com PHP 8 + PDO.

3. Decimais & Financeiros 2 tipos

Números com casas decimais de precisão exata (dinheiro, taxas, pesos) ou ponto flutuante científico.

DECIMAL(M, D) / NUMERIC(M, D)

⭐ Essencial 💾 Variável (~4 Bytes a cada 9 dígitos). DECIMAL(10,2) ocupa 5 Bytes.

Precisão exata para DINHEIRO, preços, saldos bancários, impostos e pesos comerciais.

O tipo DECIMAL(M, D) armazena números exatamente como foram digitados (em base 10), sem erros de arredondamento binário. O parâmetro M (Precisão) é o total de dígitos (antes + depois da vírgula), e o parâmetro D (Escala) é a quantidade de dígitos após a vírgula. Exemplo: `DECIMAL(10, 2)` guarda até 10 dígitos no total, sendo 8 antes da vírgula e 2 depois (até 99.999.999,99).

Limites de Capacidade: Até 65 dígitos totais (M) e até 30 casas decimais (D) no MySQL

✅ Quando Usar (Casos Ideais)

  • • Preços de produtos, valores de pedidos, descontos, fretes e saldos financeiros (`DECIMAL(10, 2)` ou `DECIMAL(12, 2)`).
  • • Taxas de juros, alíquotas de impostos ou cotações de moedas/cripto (`DECIMAL(18, 8)`).
  • • Pesos e medidas de venda por quilo ou litro (`DECIMAL(8, 3)` — ex: 1,250 kg).

🚫 Quando NÃO Usar (Armadilhas)

  • • NUNCA troque `DECIMAL` por `FLOAT` ou `DOUBLE` para guardar dinheiro! Em ponto flutuante binário, `0.1 + 0.2` resulta em `0.30000000000000004`, gerando furos de centavos no caixa.
  • • No PHP, ao ler e gravar `DECIMAL` no PDO, trafegue como `string` (`PDO::PARAM_STR`) e use a extensão `bcmath` para cálculos financeiros exatos.

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: DECIMAL (ou NUMERIC)
Size / Values: 10,2 (para moeda até R$ 99 milhões) ou 12,2 (até R$ 9 bilhões)
Default sugerido: 0.00
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB DECIMAL(10, 2)
PostgreSQL NUMERIC(10, 2) ou DECIMAL(10, 2)
SQLite NUMERIC(10, 2) (ou armazenar como INTEGER em centavos)

📋 Exemplos Reais de Colunas com DECIMAL:

preco_unitario
DECIMAL(10, 2) NOT NULL
Preço em reais (ex: 1499.90)
peso_kg
DECIMAL(8, 3) NOT NULL DEFAULT 0.000
Peso em kg com gramas (ex: 0.450)
taxa_cambio
DECIMAL(12, 6) NOT NULL
Cotação cambial com 6 casas decimais
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE itens_pedido (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    pedido_id BIGINT UNSIGNED NOT NULL,
    produto_id INT UNSIGNED NOT NULL,
    quantidade SMALLINT UNSIGNED NOT NULL DEFAULT 1,
    preco_unitario DECIMAL(10, 2) NOT NULL,
    desconto DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    subtotal DECIMAL(12, 2) GENERATED ALWAYS AS ((quantidade * preco_unitario) - desconto) STORED
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

// Em PHP, trate valores monetários como string numérica com BCMath ou centavos inteiros
// para jamais perder precisão em floats!
$precoUnitario = '129.90';
$desconto      = '15.00';

// Validação de formato decimal (até 8 inteiros e 2 casas decimais)
if (!preg_match('/^\d{1,8}(\.\d{1,2})?$/', $precoUnitario)) {
    throw new InvalidArgumentException('Formato de preço inválido.');
}

// Cálculo exato no PHP usando BCMath (2 casas decimais)
$precoFinal = bcsub($precoUnitario, $desconto, 2); // "114.90"

// No PDO, SEMPRE envie DECIMAL como PDO::PARAM_STR para preservar a precisão exata!
$stmt = $pdo->prepare('
    INSERT INTO itens_pedido (pedido_id, produto_id, quantidade, preco_unitario, desconto)
    VALUES (:pedido_id, :produto_id, :qtd, :preco, :desconto)
');
$stmt->bindValue(':pedido_id', 5001, PDO::PARAM_INT);
$stmt->bindValue(':produto_id', 99, PDO::PARAM_INT);
$stmt->bindValue(':qtd', 2, PDO::PARAM_INT);
$stmt->bindValue(':preco', $precoUnitario, PDO::PARAM_STR);
$stmt->bindValue(':desconto', $desconto, PDO::PARAM_STR);
$stmt->execute();

FLOAT / DOUBLE (Ponto Flutuante)

💾 FLOAT: 4 Bytes | DOUBLE: 8 Bytes

Números científicos aproximados de alta velocidade para sensores, física, estatística e telemetria.

FLOAT (precisão simples, 4 bytes) e DOUBLE (precisão dupla, 8 bytes) utilizam o padrão IEEE 754 de ponto flutuante binário. São processados diretamente pela unidade de ponto flutuante (FPU) do processador com extrema velocidade, mas são valores APROXIMADOS.

Limites de Capacidade: FLOAT: ~7 dígitos de precisão | DOUBLE: ~15-17 dígitos de precisão

✅ Quando Usar (Casos Ideais)

  • • Medições de sensores IoT (temperatura ambiente, umidade do ar, pressão atmosférica, velocidade do vento).
  • • Métricas estatísticas aproximadas, pesos de algoritmos de Machine Learning ou gráficos científicos.

🚫 Quando NÃO Usar (Armadilhas)

  • • PROIBIDO para valores financeiros, contábeis, preços ou saldos bancários (use `DECIMAL`).
  • • Evite fazer `WHERE valor_float = 19.99` em SQL, pois a representação binária interna pode ser `19.989999771118164`.

📐 Como Configurar no DrawDB Abrir DrawDB ↗

Type no DrawDB: DOUBLE (ou FLOAT / REAL)
Size / Values: Vazio (a sintaxe FLOAT(M,D) foi depreciada no MySQL 8)
Default sugerido: 0
Equivalência nos Dialetos do DrawDB:
MySQL / MariaDB DOUBLE ou FLOAT
PostgreSQL DOUBLE PRECISION ou REAL
SQLite REAL

📋 Exemplos Reais de Colunas com DOUBLE:

temperatura_celsius
FLOAT NOT NULL
Leitura de sensor térmico (ex: 23.45)
score_relevancia
DOUBLE NOT NULL DEFAULT 0
Pontuação estatística de busca
🗄️ SQL DDL (Importar no DrawDB: Import > SQL)
CREATE TABLE leituras_sensor (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    sensor_id INT UNSIGNED NOT NULL,
    temperatura_celsius FLOAT NOT NULL,
    umidade_relativa FLOAT NOT NULL,
    lido_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
🐘 Como Validar e Salvar no PHP 8 + PDO
<?php
declare(strict_types=1);

$temperatura = filter_var('24.65', FILTER_VALIDATE_FLOAT);
if ($temperatura === false) {
    throw new InvalidArgumentException('Temperatura inválida.');
}

$stmt = $pdo->prepare('
    INSERT INTO leituras_sensor (sensor_id, temperatura_celsius, umidade_relativa)
    VALUES (:sensor_id, :temp, :umidade)
');
$stmt->bindValue(':sensor_id', 1, PDO::PARAM_INT);
$stmt->bindValue(':temp', (string) $temperatura, PDO::PARAM_STR);
$stmt->bindValue(':umidade', '62.5', PDO::PARAM_STR);
$stmt->execute();