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 monetários
- Tipos de caracteres
- Tipos de dados binários
- Date/Time Types
- Tipo booleano
- Tipo enumerado
- Tipo geométrico
- Endereço de rede tipo
- Bit String Type
- Texto Tipo de pesquisa
- UUID Type
- XML Tipo
- JSON Tipo
- Array Type
- Declaração de Arrays
- Inserindo valores
- Acesso a Arrays
- Modificar Arrays
- Arrays de pesquisa
- Tipos compostos
- Declaração de tipos compostos
- Entrada de valores compostos
- Accessing Composite Types
- Tipos de intervalo
- Tipos de Identificadores de Objetos
- Pseudotipos
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. |