PostgreSQL – Tipo de Dados

Advertisements

Neste capítulo, vamos discutir sobre os tipos de dados utilizados no PostgreSQL. Ao criar a tabela, para cada coluna, você especifica um tipo de dado, ou seja que tipo de dados você quer armazenar nos campos da tabela.

Isso permite vários benefícios –

  • Consistência – Operações contra colunas do mesmo tipo de dados dão resultados consistentes e são geralmente as mais rápidas.

  • Validação – O uso adequado dos tipos de dados implica a validação do formato dos dados e a rejeição dos dados fora do escopo do tipo de dados.

  • Compacidez – Como uma coluna pode armazenar um único tipo de valor, ele é armazenado de forma compacta.

  • Desempenho – O uso adequado dos tipos de dados dá o armazenamento mais eficiente dos dados. Os valores armazenados podem ser processados rapidamente, o que melhora a performance.

PostgreSQL suporta 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

Tipos Numéricos consistem de inteiros de dois bytes, quatro bytes, e oito bytes, números de ponto flutuante de quatro bytes 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 Arranque
pequeno porte 2 bytes pequeno porte…número inteiro do intervalo -32768 a +32767
número inteiro 4 bytes escolha típica para número inteiro -2147483648 a +2147483647
bigint 8 bytes grande número inteiro -9223372036854775808 a 9223372036854775807
decimal variável precisão especificada pelo utilizador,exato 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,exato até 131072 dígitos antes do ponto decimal; até 16383 dígitos após a vírgula decimal
real 4 bytes precisão variável,inexata precisão de 6 dígitos decimais
precisão dupla 8 bytes precisão variável,inexato 15 dígitos decimais precisão
série menor 2 bytes crementar pequenos autoincrementos inteiro 1 a 32767
série 4 bytes autoincrementing integer 1 a 2147483647
bigserial 8 bytes grande inteiro autoincrementing 1 a 9223372036854775807

Tipos monetários

O tipo de dinheiro armazena uma quantia de moeda com uma precisão fracionária fixa. Os valores dos tipos de dados numéricos, int e bigint podem ser expressos em dinheiro. O uso de números de pontos flutuantes não é recomendado para lidar com dinheiro devido ao potencial para erros de arredondamento.

Nome Tamanho de armazenamento Descrição Arranque
money 8 bytes valor da moeda -92233720368547758.08 a +92233720368547758.07

Tipos de caracteres

A tabela abaixo lista os tipos de caracteres de uso geral disponíveis no PostgreSQL.

S. Não. Nome & Descrição
1

Caracter variando(n), varchar(n)

comprimento variável com limite

2

caracter(n), char(n)

comprimento fixo, blank padded

3

texto

comprimento variável ilimitado

Tipos de dados binários

O tipo de dados bytea permite o armazenamento de cordas binárias como na tabela abaixo.

Nome Tamanho de armazenamento Descrição
bytea 1 ou 4 bytes mais a cadeia binária real variável-comprimento da string binária

Date/Time Types

PostgreSQL suporta um conjunto completo de tipos de data e hora SQL, como se mostra na tabela abaixo. As datas são contadas de acordo com o calendário gregoriano. Aqui, todos os tipos têm resolução de 1 microssegundo / 14 dígitos excepto o tipo de data, cuja resolução é dia.

Nome Tamanho de armazenamento Descrição Baixo valor Alto valor
Amperímetro 8 bytes both data e hora (sem fuso horário) 4713 BC 294276 AD
TIMESTAMPTZ 8 bytes both data e hora, com fuso horário 4713 BC 294276 AD
data 4 bytes data (sem hora do dia) 4713 BC 5874897 AD
time 8 bytes time do dia (sem data) 00:00:00 24:00:00
hora com fuso horário 12 bytes hora somente do dia, com fuso horário 00:00:00+1459 24:00:00-1459
intervalo 12 bytes intervalo de tempo -178000000 anos 178000000 anos

Tipo booleano

PostgreSQL fornece o padrão SQL tipo booleano. O tipo de dados booleanos pode ter os estados verdadeiro, falso, e um terceiro estado, desconhecido, que é representado pelo valor nulo do SQL.

Nome Tamanho de armazenamento Descrição
booleano 1 byte Estado de verdadeiro ou falso

Tipo enumerado

Tipo enumerado (enumerar) são tipos de dados que compreendem uma estática, conjunto ordenado de valores. Eles são equivalentes aos tipos de enumeração suportados em várias linguagens de programação.

Não parecidos com outros tipos, Tipos de 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 da bússola, ou seja, NORTH, SOUTH, EAST e WEST 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

Tipo de dados geométricos representam objetos espaciais bidimensionais. O tipo mais fundamental, o ponto, forma a base para todos os outros tipos.

Nome Tamanho de armazenamento Representação Descrição
ponto 16 bytes Ponto sobre um plano (x,y)
line 32 bytes Linha de informação (não totalmente implementada) ((x1,y1),(x2),y2))
lseg 32 bytes Segmento de linha finito ((x1,y1),(x2,y2))
box 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
polígono 40+16n Polígono (semelhante a caminho fechado) ((x1,y1),…)
Círculo 24 bytes Círculo <(x,y),r> (ponto central e raio)

Endereço de rede tipo

PostgreSQL oferece tipos de dados para armazenar endereços IPv4, IPv6 e MAC. É melhor usar estes tipos em vez de tipos de texto simples para armazenar endereços de rede, porque estes tipos oferecem verificação de erros de entrada e operadores e funções especializadas.

Nome Tamanho de armazenamento Descrição
cidr 7 ou 19 bytes redes IPv4 e IPv6
inet 7 ou 19 bytes IPv4 e hosts e redes IPv6
macaddr 6 bytes Endereços MAC

Bit String Type

Bit String Types são usados para armazenar máscaras de bits. Elas são 0 ou 1. Existem dois tipos de bits SQL: bit(n) e bit varying(n), onde n é um inteiro positivo.

Texto Tipo de pesquisa

Este tipo suporta a pesquisa de texto completo, que é a atividade de pesquisar através de uma coleção de documentos em linguagem natural para localizar aqueles que melhor correspondem a uma consulta. Existem dois tipos de dados para isto –

S. No. Nome & Descrição
1

tsvector

Esta é uma lista ordenada de palavras distintas que foram normalizadas para fundir diferentes variantes de uma mesma palavra, chamadas de “lexemes”.

2

tsquery

Esta armazena lexemas que devem ser procurados, e combina-os honrando os operadores booleanos & (AND), | (OR), e ! (NÃO). Parênteses podem ser usados para impor o agrupamento dos operadores.

UUID Type

A UUID (Universally Unique Identifiers) é escrita como uma sequência de dígitos hexadecimais em minúsculas, em vários grupos separados por hífens, 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 representando os 128 bits.

Um exemplo de UUID é – 550e8400-e29b-41d4-a716-446655440000

XML Tipo

O tipo de dados XML pode ser usado para armazenar dados XML. Para armazenar dados XML, primeiro você tem que criar valores XML usando a função xmlparse como segue –

XMLPARSE (DOCUMENT '<?xml version="1.0"?><tutorial><title>PostgreSQL Tutorial </title> <topics>...</topics></tutorial>')XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')

JSON Tipo

O tipo de dados json pode ser usado para armazenar dados JSON (JavaScript Object Notation). Tais 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. Há também funções de suporte relacionadas disponíveis, que podem ser usadas diretamente para tratar o tipo de dados JSON da seguinte forma.

Exemplo Exemplo Resultado
array_to_json(‘{{{1,5},{99,100}}’::int) ,]
row_to_json(row(1,’foo’)) {“f1”:1, “f2”: “foo”}

Array Type

PostgreSQL dá a oportunidade de definir uma coluna de uma tabela como um array multidimensional de comprimento variável. Arrays de qualquer tipo de base embutida ou definida pelo usuário, tipo de enumeração, ou tipo composto podem ser criados.

Declaração de Arrays

Tipo de array 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, scheme text);

Inserindo valores

Valores de array podem ser inseridos como uma constante literal, enclausurando os valores dos elementos dentro de chaves encaracoladas e separando-os por vírgulas. Um exemplo é mostrado abaixo –

INSERT INTO monthly_savings VALUES ('Manisha', '{20000, 14600, 23500, 13250}', '{{"FD", "MF"}, {"FD", "Property"}}'); 

Acesso a Arrays

Um exemplo para acessar Arrays é mostrado abaixo. O comando dado abaixo irá selecionar as pessoas cujas economias são mais no segundo trimestre do que no quarto trimestre.

SELECT name FROM monhly_savings WHERE saving_per_quarter > saving_per_quarter;

Modificar Arrays

Um exemplo de modificação de arrays é como mostrado abaixo.

UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'WHERE name = 'Manisha';

ou usando a sintaxe da expressão ARRAY –

UPDATE monthly_savings SET saving_per_quarter = ARRAYWHERE name = 'Manisha';

Arrays de pesquisa

Um exemplo de arrays de pesquisa é como mostrado abaixo.

SELECT * FROM monthly_savings WHERE saving_per_quarter = 10000 ORsaving_per_quarter = 10000 ORsaving_per_quarter = 10000 ORsaving_per_quarter = 10000;

Se o tamanho do array é conhecido, o método de pesquisa dado acima pode ser usado. Caso contrário, o exemplo seguinte 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 seguinte 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 como abaixo –

CREATE TABLE on_hand ( item inventory_item, count integer);

Entrada de valores compostos

Os valores compostos podem ser inseridos como uma constante literal, encerrando os valores dos campos 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 item inventory_item definido acima. A palavra-chave ROW é na verdade opcional desde que você tenha mais de um campo na expressão.

Accessing Composite Types

Para acessar um campo de uma coluna composta, use um ponto seguido pelo nome do campo, muito parecido com a seleção de um campo a partir de um nome de tabela. Por exemplo, para selecionar alguns subcampos da nossa tabela de exemplos on_hand, a consulta seria como mostrado abaixo –

SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

Você pode até usar o nome da tabela também (por exemplo, em uma consulta multi-mesas), como esta –

SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

Tipos de intervalo

Tipos de intervalo representam tipos de dados que usam um intervalo de dados. Os tipos de intervalo podem ser intervalos discretos (por exemplo, todos os valores inteiros 1 a 10) ou intervalos contínuos (por exemplo qualquer ponto no tempo entre 10:00h e 11:00h).

A construção…nos tipos de intervalo disponíveis incluem os seguintes intervalos –

  • int4range – intervalo de inteiros

  • int8range – intervalo de bigint

  • numrange – intervalo de numéricos
  • tsrange – Gama de carimbo da hora sem fuso horário

  • tstzrange – Gama de carimbo da hora com fuso horário

  • daterange – Gama de data

Podem ser criados tipos de gama personalizados para disponibilizar novos tipos de gama, tais como faixas de endereços IP usando o tipo inet como base, ou faixas de flutuação usando o tipo de dados de flutuação como base.

Os tipos de faixa suportam limites de faixa 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 Identificadores de Objetos

Identificadores de Objetos (OIDs) são utilizados internamente pelo PostgreSQL como chaves primárias para várias tabelas do sistema. Se WITH OIDS for especificado ou se 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 especializadas de entrada e saída.

Nome Descrição Exemplo de valor
Oid any numérico identificador do objecto 564182
regproc pg_proc nome da função sum
regprocedimento pg_proc função com tipos de argumento sum(int4)
regoper pg_operator nome do operador +
regoperador pg_operador operador com tipos de argumentos *(inteiro,inteiro) ou -(NENHUMA,inteiro)
classe pg_classe nome da relação pg_type
regtype pg_type data type name integer
regconfig pg_ts_config configuração da pesquisa de texto Inglês
regdicionário pg_ts_dict dicionário de pesquisa de texto simples

Pseudotipos

O sistema do tipo PostgreSQL contém um número de…entradas de propósito que são coletivamente chamadas pseudo-tipos. Um pseudo-tipo não pode ser usado como um tipo de dados de coluna, mas pode ser usado para declarar um argumento de função ou tipo de resultado.

A tabela abaixo lista os pseudo-tipos existentes.

S. No. Nome & 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 array.

4

anynonarray

Indica que uma função aceita qualquer tipo de dado sem array.

5

anyenum

Indica que uma função aceita qualquer tipo de dado com array.

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 de terminação nula.

8

internal

Indica que uma função aceita ou retorna um tipo de dado interno ao servidor.

9

language_handler

Uma linguagem processual de chamada é declarada para retornar language_handler.

10

fdw_handler

Um manipulador de dados estrangeiro é declarado para retornar fdw_handler.

11

Registo

Identifica uma função retornando um tipo de linha não especificado.

12

acionador

Uma função de gatilho é declarada para retornar o gatilho.

13

void

Indica que uma função não retorna nenhum valor.

Advertisements

Deixe uma resposta

O seu endereço de email não será publicado.