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.