9.5. Funções e operadores de cadeia binária #

Esta seção descreve as funções e operadores para examinar e tratar cadeia binária, ou seja, valores do tipo de dados bytea. Muitas delas são equivalentes, em propósito e sintaxe, às funções de cadeia de caracteres de texto descritas na seção anterior.

O padrão SQL define algumas funções de cadeias binárias que usam palavras-chave, em vez de vírgulas, para separar os argumentos. Os detalhes estão na Tabela 9.11. O PostgreSQL também fornece versões destas funções que usam a sintaxe de chamada de função regular (veja a Tabela 9.12).

Tabela 9.11. Funções e operadores SQL de cadeia binária

Função/Operador

Descrição

Exemplo(s)

bytea || byteabytea

Concatena as duas cadeias binárias.

'\x123456'::bytea || '\x789a00bcde'::bytea\x123456789a00bcde

bit_length ( bytea ) → integer

Retorna o número de bits na cadeia binária (8 vezes o valor da função octet_length).

bit_length('\x123456'::bytea)24

btrim ( bytes bytea, bytesremoved bytea ) → bytea

Remove a cadeia mais longa que contém apenas os bytes que aparecem em bytesremoved do início e do fim de bytes.

btrim('\x1234567890'::bytea, '\x9012'::bytea)\x345678

ltrim ( bytes bytea, bytesremoved bytea ) → bytea

Remove a cadeia mais longa que contém apenas os bytes que aparecem em bytesremoved do início de bytes.

ltrim('\x1234567890'::bytea, '\x9012'::bytea)\x34567890

octet_length ( bytea ) → integer

Retorna o número de bytes na cadeia binária.

octet_length('\x123456'::bytea)3

overlay ( bytes bytea PLACING newsubstring bytea FROM start integer [ FOR count integer ] ) → bytea

Substitui a sub-cadeia de bytes começando no start-ésimo byte e se estende por count bytes pela newsubstring. Se count for omitido, o valor padrão será o comprimento de newsubstring.

overlay('\x1234567890'::bytea placing '\002\003'::bytea from 2 for 3)\x12020390

position ( substring bytea IN bytes bytea ) → integer

Retorna a primeira posição do início da substring especificada dentro de bytes, ou zero se não estiver presente.

position('\x5678'::bytea in '\x1234567890'::bytea)3

rtrim ( bytes bytea, bytesremoved bytea ) → bytea

Remove a cadeia mais longa que contém apenas os bytes que aparecem em bytesremoved do fim de bytes.

rtrim('\x1234567890'::bytea, '\x9012'::bytea)\x12345678

substring ( bytes bytea [ FROM start integer ] [ FOR count integer ] ) → bytea

Extrai a sub-cadeia de bytes começando no start-ésimo byte, se este for especificado, e para após count bytes, se este for especificado. É necessário fornecer pelo menos o valor de start ou count.

substring('\x1234567890'::bytea from 3 for 2)\x5678

trim ( [ LEADING | TRAILING | BOTH ] bytesremoved bytea FROM bytes bytea ) → bytea

Remove a cadeia mais longa que contém apenas bytes que aparecem em bytesremoved do início, do fim ou de ambas as extremidades (BOTH é o padrão) de bytes.

trim('\x9012'::bytea from '\x1234567890'::bytea)\x345678

trim ( [ LEADING | TRAILING | BOTH ] [ FROM ] bytes bytea, bytesremoved bytea ) → bytea

Esta é uma sintaxe fora do padrão para trim().

trim(both from '\x1234567890'::bytea, '\x9012'::bytea)\x345678


Estão disponíveis as funções adicionais para tratamento de cadeias binárias descritas na Tabela 9.12. Algumas destas funções são usadas internamente para implementar as funções de cadeia binária do padrão SQL listadas na Tabela 9.11.

Tabela 9.12. Outras funções de cadeia binária

Função

Descrição

Exemplo(s)

bit_count ( bytes bytea ) → bigint

Retorna o número de bits definidos na cadeia binária (também conhecida como popcount).

bit_count('\x1234567890'::bytea)15

crc32 ( bytea ) → bigint

Calcula o valor de CRC-32 da cadeia binária.

crc32('abc'::bytea)891568578

crc32c ( bytea ) → bigint

Calcula o valor de CRC-32 da cadeia binária.

crc32c('abc'::bytea)910901175

get_bit ( bytes bytea, n bigint ) → integer

Extrai o n-ésimo bit da cadeia binária.

get_bit('\x1234567890'::bytea, 30)1

get_byte ( bytes bytea, n integer ) → integer

Extrai o n-ésimo byte da cadeia binária.

get_byte('\x1234567890'::bytea, 4)144

length ( bytea ) → integer

Retorna o número de bytes na cadeia binária.

length('\x1234567890'::bytea)5

length ( bytes bytea, encoding name ) → integer

Retorna o número de caracteres na cadeia binária, assumindo que se trata de um texto na codificação encoding.

length('jose'::bytea, 'UTF8')4

md5 ( bytea ) → text

Calcula o hash MD5 da cadeia binária, com o resultado escrito em hexadecimal.

md5('Th\000omas'::bytea)8ab2d3c9689aaf18​b4958c334c82d8b1

reverse ( bytea ) → bytea

Inverte a ordem dos bytes na cadeia binária.

reverse('\xabcd'::bytea)\xcdab

set_bit ( bytes bytea, n bigint, newvalue integer ) → bytea

Define o n-ésimo bit na cadeia binária como newvalue.

set_bit('\x1234567890'::bytea, 30, 0)\x1234563890

set_byte ( bytes bytea, n integer, newvalue integer ) → bytea

Define o n-ésimo byte na cadeia binária como newvalue.

set_byte('\x1234567890'::bytea, 4, 64)\x1234567840

sha224 ( bytea ) → bytea

Calcula o hash SHA-224 da cadeia binária.

sha224('abc'::bytea)\x23097d223405d8228642a477bda2​55b32aadbce4bda0b3f7e36c9da7

sha256 ( bytea ) → bytea

Calcula o hash SHA-256 da cadeia binária.

sha256('abc'::bytea)\xba7816bf8f01cfea414140de5dae2223​b00361a396177a9cb410ff61f20015ad

sha384 ( bytea ) → bytea

Calcula o hash SHA-384 da cadeia binária.

sha384('abc'::bytea)\xcb00753f45a35e8bb5a03d699ac65007​272c32ab0eded1631a8b605a43ff5bed​8086072ba1e7cc2358baeca134c825a7

sha512 ( bytea ) → bytea

Calcula o hash SHA-512 da cadeia binária.

sha512('abc'::bytea)\xddaf35a193617abacc417349ae204131​12e6fa4e89a97ea20a9eeee64b55d39a​2192992a274fc1a836ba3c23a3feebbd​454d4423643ce80e2a9ac94fa54ca49f

substr ( bytes bytea, start integer [, count integer ] ) → bytea

Extrai a sub-cadeia de bytes começando no start-ésimo byte e se estendendo por count bytes, se este for especificado. (O mesmo que substring(bytes from start for count).)

substr('\x1234567890'::bytea, 3, 2)\x5678


As funções get_byte e set_byte numeram o primeiro byte da cadeia binária como byte 0. As funções get_bit e set_bit numeram os bits a partir da direita dentro de cada byte; por exemplo, o bit 0 é o bit menos significativo do primeiro byte, e o bit 15 é o bit mais significativo do segundo byte.

Por razões históricas, a função md5 retorna um valor codificado em hexadecimal do tipo de dados text, enquanto as funções SHA-2 retornam o tipo de dados bytea. Devem ser usadas as funções encode e decode para converter entre as duas formas. Por exemplo, deve ser escrito encode(sha256('abc'), 'hex') para obter uma representação textual codificada em hexadecimal, ou decode(md5('abc'), 'hex') para obter o valor bytea.

A Tabela 9.13 descreve funções para converter uma cadeia entre diferentes conjuntos de caracteres (codificações), e para representar dados binários arbitrários em formato de texto. Para estas funções, o argumento ou resultado do tipo de dados text é expresso na codificação padrão do banco de dados, enquanto argumentos ou resultados do tipo de dados bytea estão em uma codificação com nome especificado por outro argumento.

Tabela 9.13. Funções de conversão de cadeia texto/binária

Função

Descrição

Exemplo(s)

convert ( bytes bytea, src_encoding name, dest_encoding name ) → bytea

Converte uma cadeia binária que representa texto na codificação src_encoding para uma cadeia binária na codificação dest_encoding (veja na Seção 23.3.4 as conversões disponíveis).

convert('text_in_utf8', 'UTF8', 'LATIN1')\x746578745f696e5f75746638

convert_from ( bytes bytea, src_encoding name ) → text

Converte uma cadeia binária que representa texto na codificação src_encoding para text na codificação do banco de dados (veja na Seção 23.3.4 as conversões disponíveis).

convert_from('text_in_utf8', 'UTF8')text_in_utf8

convert_to ( string text, dest_encoding name ) → bytea

Converte uma cadeia de caracteres do tipo de dados text (na codificação do banco de dados) em uma cadeia binária codificada na codificação dest_encoding (veja na Seção 23.3.4 as conversões disponíveis).

convert_to('some_text', 'UTF8')\x736f6d655f74657874

encode ( bytes bytea, format text ) → text

Codifica dados binários em uma representação textual; os valores de format com suporte são: base64, escape, hex.

encode('123\000\001', 'base64')MTIzAAE=

decode ( string text, format text ) → bytea

Decodifica dados binários a partir da representação textual; os valores de format com suporte são os mesmos de encode.

decode('MTIzAAE=', 'base64')\x3132330001


As funções encode e decode oferecem suporte para os seguintes formatos de texto:

base64 #

O formato base64 é o especificado pelo RFC 2045 Section 6.8. Segundo o RFC, as linhas codificadas são quebradas em 76 caracteres. No entanto, em vez do marcador de fim de linha MIME CRLF, apenas o caractere de nova linha é usado para marcar o fim da linha. A função decode ignora os caracteres de retorno de carro, nova linha, espaço e tabulação. De outra forma, será gerado erro quando for fornecido para a função decode dados base64 inválidos — inclusive quando o preenchimento à direita estiver incorreto.

escape #

O formato escape converte bytes zero e bytes com o bit alto definido em sequências de escape octais (\nnn), e duplica as contrabarras. Outros valores de byte são representados literalmente. A função decode gera erro se uma contrabarra não for seguida por uma segunda contrabarra, ou três dígitos octais; a função aceita os outros valores de byte sem alterações.

hex #

O formato hex representa cada 4 bits de dados como um dígito hexadecimal, de 0 a f, escrevendo primeiro o dígito de ordem superior de cada byte. A função encode gera os dígitos hexadecimais a-f em letras minúsculas. Como a menor unidade de dados é 8 bits, sempre há um número par de caracteres retornados pela função encode. A função decode aceita os caracteres a-f em maiúsculas ou minúsculas. É gerado erro quando a função decode recebe dados hexadecimais inválidos — inclusive quando é fornecido um número ímpar de caracteres.

Além disso, é possível converter valores inteiros de e para o tipo de dados bytea. Converter um inteiro para bytea produz 2, 4 ou 8 bytes, dependendo da largura do tipo de dados inteiro. O resultado é a representação em complemento de dois do valor inteiro, com o byte mais significativo primeiro. Alguns exemplos:

1234::smallint::bytea          → \x04d2
cast(1234 as bytea)            → \x000004d2
cast(-1234 as bytea)           → \xfffffb2e
'\x8000'::bytea::smallint      → -32768
'\x8000'::bytea::integer       → 32768

Converter de `bytea` para um inteiro resultará em um erro se o comprimento de `bytea` exceder a largura do tipo de dados inteiro.

Veja também a função de agregação string_agg na Seção 9.21, e as funções de objeto grande na Seção 33.4.