PostgreSQL - Tipo de dados
Neste capítulo, discutiremos sobre os tipos de dados usados no PostgreSQL. Ao criar a tabela, para cada coluna, você especifica um tipo de dados, ou seja, que tipo de dados deseja armazenar nos campos da tabela.
Isso permite vários benefícios -
Consistency - As operações em colunas do mesmo tipo de dados fornecem resultados consistentes e geralmente são as mais rápidas.
Validation - O uso adequado de tipos de dados implica validação de formato de dados e rejeição de dados fora do escopo do tipo de dados.
Compactness - Como uma coluna pode armazenar um único tipo de valor, ele é armazenado de forma compacta.
Performance- O uso adequado de tipos de dados fornece o armazenamento de dados mais eficiente. Os valores armazenados podem ser processados rapidamente, o que melhora o desempenho.
PostgreSQL oferece suporte a um amplo conjunto de tipos de dados. Além disso, os usuários podem criar seus próprios tipos de dados personalizados usando o comando CREATE TYPE SQL. Existem diferentes categorias de tipos de dados no PostgreSQL. Eles são discutidos abaixo.
Tipos Numéricos
Os tipos numéricos consistem em números inteiros de dois, quatro e oito bytes, números de ponto flutuante de quatro e oito bytes e decimais de precisão selecionável. A tabela a seguir lista os tipos disponíveis.
Nome | Tamanho de Armazenamento | Descrição | Alcance |
---|---|---|---|
smallint | 2 bytes | inteiro de pequeno alcance | -32768 a +32767 |
inteiro | 4 bytes | escolha típica para inteiro | -2147483648 a +2147483647 |
bigint | 8 bytes | inteiro de grande alcance | -9223372036854775808 a 9223372036854775807 |
decimal | variável | precisão especificada pelo usuário, exata | até 131072 dígitos antes da vírgula decimal; até 16383 dígitos após o ponto decimal |
numérico | variável | precisão especificada pelo usuário, exata | até 131072 dígitos antes da vírgula decimal; até 16383 dígitos após o ponto decimal |
real | 4 bytes | precisão variável, inexata | Precisão de 6 dígitos decimais |
dupla precisão | 8 bytes | precisão variável, inexata | Precisão de 15 dígitos decimais |
pequeno | 2 bytes | pequeno inteiro de incremento automático | 1 a 32767 |
serial | 4 bytes | número inteiro autoincrementado | 1 a 2147483647 |
grande série | 8 bytes | grande número inteiro de incremento automático | 1 a 9223372036854775807 |
Tipos monetários
O tipo de dinheiro armazena uma quantia em moeda com uma precisão fracionária fixa. Os valores dos tipos de dados numéricos, int e bigint podem ser convertidos em dinheiro . O uso de números de ponto flutuante não é recomendado para lidar com dinheiro devido ao potencial de erros de arredondamento.
Nome | Tamanho de Armazenamento | Descrição | Alcance |
---|---|---|---|
dinheiro | 8 bytes | quantidade de moeda | -92233720368547758,08 a +92233720368547758,07 |
Tipos de personagem
A tabela abaixo lista os tipos de caracteres de uso geral disponíveis no PostgreSQL.
S. No. | Nome e Descrição |
---|---|
1 | character varying(n), varchar(n) comprimento variável com limite |
2 | character(n), char(n) comprimento fixo, acolchoado em branco |
3 | text comprimento ilimitado variável |
Tipos de dados binários
O tipo de dados bytea permite o armazenamento de cadeias binárias como na tabela abaixo.
Nome | Tamanho de Armazenamento | Descrição |
---|---|---|
tchau | 1 ou 4 bytes mais a string binária real | string binária de comprimento variável |
Tipos de data / hora
O PostgreSQL suporta um conjunto completo de tipos de data e hora SQL, conforme mostrado na tabela abaixo. As datas são contadas de acordo com o calendário gregoriano. Aqui, todos os tipos têm resolução de1 microsecond / 14 digits exceto date tipo, cuja resolução é day.
Nome | Tamanho de Armazenamento | Descrição | Baixo valor | Valor alto |
---|---|---|---|---|
carimbo de data / hora [(p)] [sem fuso horário] | 8 bytes | data e hora (sem fuso horário) | 4713 AC | 294276 DC |
TIMESTAMPTZ | 8 bytes | data e hora, com fuso horário | 4713 AC | 294276 DC |
encontro | 4 bytes | data (sem hora do dia) | 4713 AC | 5874897 DC |
hora [(p)] [sem fuso horário] | 8 bytes | hora do dia (sem data) | 00:00:00 | 24:00:00 |
hora [(p)] com fuso horário | 12 bytes | somente horas do dia, com fuso horário | 00: 00: 00 + 1459 | 24: 00-1459 |
intervalo [campos] [(p)] | 12 bytes | intervalo de tempo | -178000000 anos | 178000000 anos |
Tipo Booleano
PostgreSQL fornece o tipo Booleano SQL padrão. O tipo de dados Booleano pode ter os estados verdadeiro , falso e um terceiro estado, desconhecido , que é representado pelo valor nulo SQL.
Nome | Tamanho de Armazenamento | Descrição |
---|---|---|
boleano | 1 byte | estado de verdadeiro ou falso |
Tipo Enumerado
Tipos enumerados (enum) são tipos de dados que compreendem um conjunto de valores estáticos e ordenados. Eles são equivalentes aos tipos de enum suportados em várias linguagens de programação.
Ao contrário de outros tipos, os tipos enumerados precisam ser criados usando o comando CREATE TYPE. Este tipo é usado para armazenar um conjunto de valores estáticos e ordenados. Por exemplo, direções de bússola, ou seja, NORTE, SUL, EAST e OESTE ou dias da semana como mostrado abaixo -
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
Enumerado, uma vez criado, pode ser usado como qualquer outro tipo.
Tipo Geométrico
Os tipos de dados geométricos representam objetos espaciais bidimensionais. O tipo mais fundamental, o ponto, forma a base de todos os outros tipos.
Nome | Tamanho de Armazenamento | Representação | Descrição |
---|---|---|---|
ponto | 16 bytes | Aponte em um avião | (x, y) |
linha | 32 bytes | Linha infinita (não totalmente implementada) | ((x1, y1), (x2, y2)) |
lseg | 32 bytes | Segmento de linha finita | ((x1, y1), (x2, y2)) |
caixa | 32 bytes | Caixa Retangular | ((x1, y1), (x2, y2)) |
caminho | 16 + 16n bytes | Caminho fechado (semelhante ao polígono) | ((x1, y1), ...) |
caminho | 16 + 16n bytes | Caminho aberto | [(x1, y1), ...] |
polígono | 40 + 16n | Polígono (semelhante ao caminho fechado) | ((x1, y1), ...) |
círculo | 24 bytes | Círculo | <(x, y), r> (ponto central e raio) |
Tipo de endereço de rede
O PostgreSQL oferece tipos de dados para armazenar endereços IPv4, IPv6 e MAC. É melhor usar esses tipos em vez de tipos de texto simples para armazenar endereços de rede, porque esses tipos oferecem verificação de erro de entrada e operadores e funções especializados.
Nome | Tamanho de Armazenamento | Descrição |
---|---|---|
cidr | 7 ou 19 bytes | Redes IPv4 e IPv6 |
inet | 7 ou 19 bytes | Hosts e redes IPv4 e IPv6 |
macaddr | 6 bytes | Endereços MAC |
Tipo de seqüência de bits
Os tipos de sequência de bits são usados para armazenar máscaras de bits. Eles são 0 ou 1. Existem dois tipos de bits SQL:bit(n) e bit varying(n), onde n é um número inteiro positivo.
Tipo de pesquisa de texto
Esse tipo oferece suporte à pesquisa de texto completo, que é a atividade de pesquisar uma coleção de documentos em linguagem natural para localizar aqueles que melhor correspondem a uma consulta. Existem dois tipos de dados para isso -
S. No. | Nome e Descrição |
---|---|
1 | tsvector Esta é uma lista classificada de palavras distintas que foram normalizadas para mesclar diferentes variantes da mesma palavra, chamadas de "lexemas". |
2 | tsquery Isso armazena lexemas que devem ser pesquisados e os combina honrando os operadores booleanos & (AND), | (Ou e ! (NÃO). Os parênteses podem ser usados para forçar o agrupamento dos operadores. |
Tipo UUID
Um UUID (Universally Unique Identifiers) é escrito como uma sequência de dígitos hexadecimais minúsculos, em vários grupos separados por hifens, especificamente um grupo de oito dígitos, seguido por três grupos de quatro dígitos, seguido por um grupo de 12 dígitos, para um total de 32 dígitos que representam os 128 bits.
Um exemplo de UUID é - 550e8400-e29b-41d4-a716-446655440000
Tipo XML
O tipo de dados XML pode ser usado para armazenar dados XML. Para armazenar dados XML, primeiro você deve criar valores XML usando a função xmlparse da seguinte forma -
XMLPARSE (DOCUMENT '<?xml version="1.0"?>
<tutorial>
<title>PostgreSQL Tutorial </title>
<topics>...</topics>
</tutorial>')
XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
Tipo JSON
O tipo de dados json pode ser usado para armazenar dados JSON (JavaScript Object Notation). Esses dados também podem ser armazenados como texto , mas o tipo de dados json tem a vantagem de verificar se cada valor armazenado é um valor JSON válido. Também estão disponíveis funções de suporte relacionadas, que podem ser usadas diretamente para lidar com o tipo de dados JSON da seguinte maneira.
Exemplo | Resultado de exemplo |
---|---|
array_to_json ('{{1,5}, {99,100}}' :: int []) | [[1,5], [99,100]] |
row_to_json (linha (1, 'foo')) | {"f1": 1, "f2": "foo"} |
Tipo de Matriz
O PostgreSQL oferece a oportunidade de definir uma coluna de uma tabela como um array multidimensional de comprimento variável. Matrizes de qualquer tipo de base, tipo enum ou tipo composto integrado ou definido pelo usuário podem ser criadas.
Declaração de Matrizes
O tipo de matriz pode ser declarado como
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer[],
scheme text[][]
);
ou usando a palavra-chave "ARRAY" como
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer ARRAY[4],
scheme text[][]
);
Inserindo valores
Os valores da matriz podem ser inseridos como uma constante literal, colocando os valores dos elementos entre chaves e separando-os por vírgulas. Um exemplo é mostrado abaixo -
INSERT INTO monthly_savings
VALUES (‘Manisha’,
‘{20000, 14600, 23500, 13250}’,
‘{{“FD”, “MF”}, {“FD”, “Property”}}’);
Acessando matrizes
Um exemplo para acessar Arrays é mostrado abaixo. O comando dado abaixo selecionará as pessoas cujas economias são maiores no segundo trimestre do que no quarto trimestre.
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
Modificando Arrays
Um exemplo de modificação de matrizes é mostrado abaixo.
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Manisha';
ou usando a sintaxe de expressão ARRAY -
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Manisha';
Pesquisando matrizes
Um exemplo de pesquisa de matrizes é mostrado abaixo.
SELECT * FROM monthly_savings WHERE saving_per_quarter[1] = 10000 OR
saving_per_quarter[2] = 10000 OR
saving_per_quarter[3] = 10000 OR
saving_per_quarter[4] = 10000;
Se o tamanho da matriz for conhecido, o método de pesquisa fornecido acima pode ser usado. Caso contrário, o exemplo a seguir mostra como pesquisar quando o tamanho não é conhecido.
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
Tipos Compostos
Este tipo representa uma lista de nomes de campos e seus tipos de dados, ou seja, estrutura de uma linha ou registro de uma tabela.
Declaração de Tipos Compostos
O exemplo a seguir mostra como declarar um tipo composto
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
Este tipo de dados pode ser usado nas tabelas de criação conforme abaixo -
CREATE TABLE on_hand (
item inventory_item,
count integer
);
Entrada de valor composto
Os valores compostos podem ser inseridos como uma constante literal, colocando os valores do campo entre parênteses e separando-os por vírgulas. Um exemplo é mostrado abaixo -
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
Isso é válido para o inventário_item definido acima. A palavra-chave ROW é opcional, desde que você tenha mais de um campo na expressão.
Acessando Tipos Compostos
Para acessar um campo de uma coluna composta, use um ponto seguido do nome do campo, da mesma forma que selecionar um campo em um nome de tabela. Por exemplo, para selecionar alguns subcampos de nossa tabela de exemplo on_hand, a consulta seria como mostrado abaixo -
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
Você também pode usar o nome da tabela (por exemplo, em uma consulta multitables), como este -
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
Tipos de faixa
Tipos de intervalo representam tipos de dados que usam um intervalo de dados. O tipo de intervalo pode ser intervalos discretos (por exemplo, todos os valores inteiros de 1 a 10) ou intervalos contínuos (por exemplo, qualquer ponto no tempo entre 10h00 e 11h00).
Os tipos de intervalos integrados disponíveis incluem os seguintes intervalos -
int4range - Intervalo de inteiro
int8range - Alcance de bigint
numrange - Variação numérica
tsrange - Intervalo de carimbo de data / hora sem fuso horário
tstzrange - Intervalo de carimbo de data / hora com fuso horário
daterange - Intervalo de data
Os tipos de intervalos personalizados podem ser criados para disponibilizar novos tipos de intervalos, como intervalos de endereços IP usando o tipo inet como base, ou intervalos flutuantes usando o tipo de dados flutuante como base.
Os tipos de intervalo oferecem suporte a limites de intervalo inclusivos e exclusivos usando os caracteres [] e (), respectivamente. Por exemplo, '[4,9)' representa todos os inteiros começando de e incluindo 4 até, mas não incluindo 9.
Tipos de identificador de objeto
Identificadores de objeto (OIDs) são usados internamente pelo PostgreSQL como chaves primárias para várias tabelas de sistema. Se WITH OIDS for especificado ou a variável de configuração default_with_oids estiver habilitada, somente então, em tais casos, OIDs são adicionados às tabelas criadas pelo usuário. A tabela a seguir lista vários tipos de alias. Os tipos de alias OID não têm operações próprias, exceto para rotinas de entrada e saída especializadas.
Nome | Referências | Descrição | Exemplo de valor |
---|---|---|---|
oid | qualquer | identificador numérico de objeto | 564182 |
regproc | pg_proc | nome da função | soma |
procedimento normativo | pg_proc | função com tipos de argumento | soma (int4) |
regoper | pg_operator | nome do operador | + |
regoperador | pg_operator | operador com tipos de argumento | * (inteiro, inteiro) ou - (NENHUM, inteiro) |
regclass | pg_class | nome da relação | pg_type |
regtype | pg_type | nome do tipo de dados | inteiro |
regconfig | pg_ts_config | configuração de pesquisa de texto | Inglês |
regdictionary | pg_ts_dict | dicionário de pesquisa de texto | simples |
Pseudo tipos
O sistema de tipos do PostgreSQL contém várias entradas de propósito especial que são chamadas coletivamente de pseudo-tipos. Um pseudo-tipo não pode ser usado como um tipo de dados de coluna, mas pode ser usado para declarar o argumento de uma função ou tipo de resultado.
A tabela abaixo lista os pseudo-tipos existentes.
S. No. | Nome e Descrição |
---|---|
1 | any Indica que uma função aceita qualquer tipo de dado de entrada. |
2 | anyelement Indica que uma função aceita qualquer tipo de dados. |
3 | anyarray Indica que uma função aceita qualquer tipo de dados de matriz. |
4 | anynonarray Indica que uma função aceita qualquer tipo de dados que não seja de matriz. |
5 | anyenum Indica que uma função aceita qualquer tipo de dados enum. |
6 | anyrange Indica que uma função aceita qualquer tipo de dado de intervalo. |
7 | cstring Indica que uma função aceita ou retorna uma string C terminada em nulo. |
8 | internal Indica que uma função aceita ou retorna um tipo de dados interno do servidor. |
9 | language_handler Um manipulador de chamadas de linguagem procedural é declarado para retornar language_handler. |
10 | fdw_handler Um manipulador de wrapper de dados externos é declarado para retornar fdw_handler. |
11 | record Identifica uma função que retorna um tipo de linha não especificado. |
12 | trigger Uma função de gatilho é declarada para retornar o gatilho. |
13 | void Indica que uma função não retorna nenhum valor. |