Tipos de Dados no PostgreSQL: Uma Visão Geral

O PostgreSQL oferece uma ampla variedade de tipos de dados embutidos. Caso necessário, novos tipos podem ser criados pelos usuários através do comando CREATE TYPE.

Tipos de Dados Básicos

A tabela a seguir apresenta os tipos de dados comuns disponíveis por padrão. Muitas das alternativas listadas na coluna "Nome Alternativo" são nomes internos mantidos por motivos históricos.

Nome Nome Alternativo Descrição
bigint int8 Inteiro com sinal de 8 bytes
bigserial serial8 Inteiro autoincremento de 8 bytes
bit [ (n) ] String de bits de tamanho fixo
bit varying [ (n) ] varbit String de bits de tamanho variável
boolean bool Booleano lógico (verdadeiro/falso)
box Retângulo em um plano
bytea Dados binários ("array de bytes")
character varying [ (n) ] varchar [ (n) ] String de tamanho variável
character [ (n) ] char [ (n) ] String de tamanho fixo
cidr Endereço de rede IPv4 ou IPv6
circle Círculo em um plano
date Data do calendário (ano, mês, dia)
double precision float8 Número de ponto flutuante de precisão dupla
inet Endereço de rede IPv4 ou IPv6
integer int, int4 Inteiro com sinal de 4 bytes
interval [ (p) ] Intervalo de tempo
line Linha infinita em um plano
lseg Segmento de linha em um plano
macaddr Endereço MAC
money Quantia monetária
numeric [ (p, s) ] decimal [ (p, s) ] Número exato com precisão configurável
path Caminho geométrico em um plano
point Ponto em um plano
polygon Caminho geométrico fechado em um plano
real float4 Número de ponto flutuante de precisão simples
smallint int2 Inteiro com sinal de 2 bytes
serial serial4 Inteiro autoincremento de 4 bytes
text String de tamanho variável
time [ (p) ] [ without time zone ] Hora do dia
time [ (p) ] with time zone timetz Hora do dia com fuso horário
timestamp [ (p) ] [ without time zone ] Data e hora
timestamp [ (p) ] with time zone timestamptz Data e hora com fuso horário

Compatibilidade: Os seguintes tipos (ou grafias) são declarados no SQL: bit, bit varying, boolean, char, character, character varying, varchar, date, double precision, integer, interval, numeric, decimal, real, smallint, time (com e sem fuso horário) e timestamp (com e sem fuso horário).

A representação externa de cada tipo de dado é determinada pelas suas funções de entrada e saída. Muitos tipos embutidos possuem formatos óbvios. Entretanto, alguns são específicos do PostgreSQL (como caminhos geométricos), ou podem ter múltiplas representações (como tipos de data e hora). Algumas funções de entrada e saída podem não ser reversíveis, ou seja, a saída pode perder precisão em comparação com a entrada original.

Ao definir uma tabela, a escolha do tipo para a chave primária pode ser baseada na tabela acima. Por exemplo, utilizar o tipo serial para uma coluna de identificador (id) em uma tabela chamada registros_sistema criará automaticamente uma sequência e um índice para essa coluna.

Tipos Numéricos

Os tipos numéricos compreendem inteiros de 2, 4 ou 8 bytes, números de ponto flutuante de 4 ou 8 bytes, e números de precisão arbitrária.

Nome Tamanho Descrição Intervalo
smallint 2 bytes Inteiro de intervalo pequeno -32768 a +32767
integer 4 bytes Inteiro padrão -2147483648 a +2147483647
bigint 8 bytes Inteiro de grande intervalo -9223372036854775808 a 9223372036854775807
numeric, decimal Variável Precisão configurável, exato Sem limite
real 4 bytes Precisão variável, inexato Precisão de 6 dígitos decimais
double precision 8 bytes Precisão variável, inexato Precisão de 15 dígitos decimais
serial 4 bytes Inteiro autoincremento 1 a +2147483647
bigserial 8 bytes Inteiro autoincremento de grande intervalo 1 a 9223372036854775807

Tipos Inteiros

Os tipos smallint, integer e bigint armazenam números inteiros em diferentes intervalos. Tentar armazenar um valor fora do intervalo resultará em um erro.

O tipo integer é o mais utilizado, oferecendo um bom equilíbrio entre intervalo, consumo de espaço e desempenho. O smallint é geralmente usado apenas quando o espaço em disco é uma preocupação crítica. O bigint deve ser usado somente quando o intervalo do integer é ensuficiente.

O SQL padrão declara apenas os tipos integer (ou int) e smallint. Os tipos bigint, int2, int4 e int8 são extensões comuns em muitos outros sistemas de banco de dados SQL.

Números de Precisão Arbitrária

O tipo numeric pode armazenar números com até 1000 dígitos de precisão e realizar cálculos com exatidão. É altamente recomendado para valores monetários ou outras quantidades que exigem precisão absoluta. No entanto, as operações aritméticas em campos numeric são significativamente mais lentas do que nos tipos inteiros ou de ponto flutuante.

A precisão e a escala de um campo numeric são configuráveis. Para declarar um campo com uma precisão e escala específicas:

NUMERIC(precisao, escala)

A precisão deve ser positiva e a escala pode ser zero ou positiva. A declaração:

NUMERIC(precisao)

assume uma escala de 0. A declaração simples:

NUMERIC

cria uma coluna capaz de armazenar um número com precisão e escala arbitrárias até o limite de implementação.

Se um valor a ser armazenado tiver uma escala maior do que a declarada, o sistema tentará arredondá-lo para o número especificado de casas decimais. Se a quantidade de dígitos à esquerda da vírgula exceder a precisão declarada menos a escala declarada, um erro será gerado.

Fisicamente, os valores são armazenados sem zeros à esquerda ou à direita. Portanto, a precisão e a escala declaradas são valores máximos, não uma alocação fixa. O armazenamento real utiliza 2 bytes para cada 4 dígitos decimais, mais 8 bytes de sobrecarga.

Além dos valores numéricos comuns, o tipo numeric permite o valor especial NaN (Not a Number). Qualquer operação com NaN resulta em outro NaN. Para usar esse valor em comandos SQL, ele deve ser cercado por aspas simples: UPDATE tabela SET coluna = 'NaN'. Os tipos decimal e numeric são equivalentes.

Tipos de Ponto Flutuante

Os tipos real e double precision são tipos numéricos inexatos de precisão variável. Eles são implementações da aritmética de ponto flutuante binária IEEE 754 (precisão simples e dupla, respectivamente), suportada pelo processador, sistema operacional e compilador subjacentes.

"Inexato" significa que alguns valores não podem ser representados com precisão interna e são armazenados de forma aproximada. Portanto, armazenar e depois imprimir um valor pode revelar uma discrepância.

  • Para cálculos que exigem exatidão (como finanças), utilize numeric.
  • Ao usar estes tipos para cálculos complexos, especialmente aqueles que dependem de casos extremos (infinito, underflow), avalie cuidadosamente sua implementação.
  • A comparação de igualdade entre dois valores de ponto flutuante pode não se comportar como o esperado.

Geralmente, o tipo real tem um intervalo de pelo menos -1E+37 a +1E+37 e uma precisão de pelo menos 6 dígitos decimais. O double precision normalmente tem um intervalo de -1E+308 a +1E+308 e uma precisão de pelo menos 15 dígitos. Valores muito grandes ou muito pequenos resultarão em erro.

Os tipos de ponto flutuante suportam os seguintes valores especiais:

Infinity
-Infinity
NaN

Esses valores representam os valores especiais do IEEE 754: "infinito positivo", "infinito negativo" e "não é um número". Para usá-los como constantes em comandos SQL, cerc-os com aspas simples: UPDATE tabela SET coluna = 'Infinity'. O PostgreSQL também suporta a notação SQL float e float(p) para declarar tipos numéricos inexatos. Aqui, p indica a precisão mínima aceitável em bits. Para real, o PostgreSQL aceita float(1) a float(24); para double precision, aceita float(25) a float(53). Um float sem precisão é tratado como double precision.

Tipos Serial

Os tipos serial e bigserial não são tipos de dados reais, mas sim uma convenção sintática para criar colunas com identificadores únicos autoincrementáveis (semelhante ao atributo AUTO_INCREMENT de outros bancos).

A declaração:

CREATE TABLE minha_tabela (
    id SERIAL
);

é equivalente a:

CREATE SEQUENCE minha_tabela_id_seq;
CREATE TABLE minha_tabela(
    id integer DEFAULT nextval('minha_tabela_id_seq') NOT NULL
);

Portanto, é criada uma coluna inteira cujo valor padrão é obtido de uma sequência. Uma restrição NOT NULL é implicitamente aplicada. Na maioria dos casos, você provavelmente também desejará adicionar uma restrição UNIQUE ou PRIMARY KEY para evitar inserções acidentais de valores duplicados, mas isso não é feito automaticamente.

Os nomes serial e serial4 são equivalentes (criam uma coluna integer). Da mesma forma, bigserial e serial8 são equivalentes (criam uma coluna bigint). Use bigserial se você antecipar mais de 231 identificadores no ciclo de vida da tabela.

Uma sequência criada por um tipo serial é automaticamente excluída quando a coluna associada é removida. Se outras colunas ou objetos dependerem dessa sequência (por exemplo, através de chamadas manuais à função nextval), a exclusão da sequência pode quebrar essas dependências.

Tags: postgresql tipos de dados SQL banco de dados numeric

Publicado em 7-5 17:56