Hoje vamos trocar uma ideia sobre tipos de dados numéricos no PostgreSQL. Se você já ficou na dúvida de como guardar o número "42", fazer contas financeiras ou até guardar milissegundos, tá no lugar certo. Bora entender qual tipo serve pra cada parada, pra você e seus dados ficarem de boa.
Os tipos numéricos no PostgreSQL se dividem em três grupos principais:
- Números inteiros (
INTEGER): pra guardar números sem parte decimal. Tipo 1, 42, -7, esses clássicos. - Números exatos (
NUMERIC): pra guardar números com uma quantidade fixa de casas decimais. Perfeito pra contas de grana, onde precisão é tudo. - Números de ponto flutuante (
REAL): pra guardar números que podem ser gigantes ou minúsculos. Eles são menos precisos queNUMERIC, mas ótimos pra cálculos científicos.
Tipo INTEGER
INTEGER é o tipo pra números inteiros. Serve quando você precisa guardar números sem parte decimal. O PostgreSQL tem três variações de INTEGER pra cobrir vários intervalos:
SMALLINT: tipo inteiro pequeno. Intervalo: de -32.768 até 32.767.INTEGER(ouINT): tipo inteiro padrão. Intervalo: de -2.147.483.648 até 2.147.483.647.BIGINT: pra números grandões. Intervalo: de -9.223.372.036.854.775.808 até 9.223.372.036.854.775.807.
Imagina que a gente tem uma tabela students onde ficam as infos dos estudantes: nome, idade e quantos créditos (pontos acadêmicos) eles já pegaram:
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Agora vamos rodar uma query SQL simples pra pegar a lista de estudantes com idade e créditos:
SELECT name, age, credits
FROM students;
Resultado:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Quando usar INTEGER?
- Guardar identificadores (
id, número de pedido). - Guardar quantidades de alguma coisa (tipo quantidade de produtos no estoque, número de estudantes).
Tipo NUMERIC
NUMERIC é o tipo pra números exatos com casas decimais fixas. Se você precisa guardar algo tipo 123.456, e errar uma casa decimal pode te dar dor de cabeça (ou prejuízo), vai de NUMERIC.
Formato pra declarar: NUMERIC(precision, scale), onde:
precision— total de dígitos (antes e depois da vírgula).scale— quantos dígitos depois da vírgula.
Por exemplo, NUMERIC(6, 2) deixa você guardar números com até 6 dígitos, sendo 2 depois da vírgula.
Vamos criar uma tabela pra registrar transações financeiras:
| id | description | amount |
|---|---|---|
| 1 | Pagamento pelo curso | 2345.67 |
| 2 | Bolsa mensal | 500.00 |
| 3 | Taxa de laboratório | 145.99 |
| 4 | Multa da biblioteca | 12.75 |
| 5 | Inscrição na conferência | 320.50 |
Agora vamos mostrar a lista de transações:
SELECT description, amount
FROM transactions;
Resultado:
| description | amount |
|---|---|
| Pagamento pelo curso | 2345.67 |
| Bolsa mensal | 500.00 |
| Taxa de laboratório | 145.99 |
| Multa da biblioteca | 12.75 |
| Inscrição na conferência | 320.50 |
Quando usar NUMERIC?
- Contas financeiras (preço de produtos, salários).
- Guardar medições exatas (peso, comprimento).
Tabela measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Agora vamos mostrar os valores:
SELECT mass, height
FROM measurements;
Resultado:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Quando usar REAL?
- Cálculos científicos (massa de átomos, distância até a Lua).
- Modelagem de dados onde um errinho é de boa.
Comparando tipos numéricos: quando usar cada um?
| Tipo de dado | Intervalo | Precisão | Exemplos de uso |
|---|---|---|---|
SMALLINT |
-32.768 até 32.767 | Números inteiros | Números pequenos (idade, avaliações). |
INTEGER |
-2.147.483.648 até 2.147.483.647 | Números inteiros | Identificadores, quantidades. |
BIGINT |
-9.223.372.036.854.775.808 até 9.223.372.036.854.775.807 | Números inteiros | Números muito grandes. |
NUMERIC |
Depende do precision e scale |
Números decimais exatos | Finanças, medições. |
REAL |
Aproximadamente 6 casas decimais | Ponto flutuante | Dados aproximados ou científicos. |
DOUBLE PRECISION |
Aproximadamente 15 casas decimais | Ponto flutuante de alta precisão | Ciência, pesquisa. |
Apelidos
No PostgreSQL, vários tipos numéricos têm apelidos (sinônimos) — são nomes alternativos pros tipos, que funcionam igualzinho, mas deixam o código mais legível ou compatível com outros bancos.
Aqui vai um guia rápido e direto sobre apelidos de tipos numéricos no PostgreSQL:
Apelidos para tipos inteiros
| Apelido | Tipo real | Tamanho | Intervalo |
|---|---|---|---|
INT |
INTEGER |
4 bytes | −2.147.483.648 até 2.147.483.647 |
INT4 |
INTEGER |
4 bytes | (apelido antigo) |
SMALLINT |
SMALLINT |
2 bytes | −32.768 até 32.767 |
INT2 |
SMALLINT |
2 bytes | |
BIGINT |
BIGINT |
8 bytes | −9 quintilhões até +9 quintilhões |
INT8 |
BIGINT |
8 bytes |
Apelidos para números exatos
| Apelido | Tipo real | Uso |
|---|---|---|
DEC |
NUMERIC |
Sinônimo do padrão SQL |
DECIMAL |
NUMERIC |
Mesma coisa |
Apelidos para números de ponto flutuante
| Apelido | Tipo real | Precisão |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 dígitos (padrão) |
FLOAT(24) |
REAL |
~6 dígitos |
FLOAT(53) |
DOUBLE PRECISION |
~15 dígitos |
FLOAT8 |
DOUBLE PRECISION |
Apelido antigo |
FLOAT4 |
REAL |
Apelido antigo |
Erros comuns
Quando você mexe com tipos numéricos, pode cair em algumas ciladas:
Escolher um tipo de dado pequeno demais. Se você usar SMALLINT pra idade de pessoas, tá vacilando. O robô da "Matrix" com milhões de anos vai ficar chateado.
Perda de dados por arredondamento. Se usar REAL pra contas de dinheiro, pode perder uns centavos. E depois a confiança da galera.
Comparar tipos diferentes. Se comparar INTEGER com REAL, pode ter resultados estranhos por causa de como números de ponto flutuante funcionam.
GO TO FULL VERSION