8.4. Tipo de dados binário

8.4.1. Formato hex de bytea
8.4.2. Formato escape de bytea
8.4.3. Exemplo

O tipo de dados bytea permite o armazenamento de cadeias binárias; veja a Tabela 8.6.

Tabela 8.6. Tipo binário

NomeTamanho de armazenamentoDescrição
bytea1 ou 4 bytes mais a cadeia binária realcadeia binária de comprimento variável

Uma cadeia binária é uma sequência de octetos (ou bytes). As cadeias binárias se diferenciam das cadeias de caracteres de duas maneiras. Em primeiro lugar, as cadeias binárias permitem armazenar octetos com valor zero e outros octetos não imprimíveis (geralmente, octetos fora do intervalo decimal de 32 a 126). As cadeias de caracteres não permitem octetos com valor zero e, também, não permitem quaisquer outros valores de octetos, e sequências de valores de octetos, que sejam inválidos segundo a codificação do conjunto de caracteres selecionado do banco de dados. Em segundo lugar, as operações em cadeias binárias processam os bytes reais, enquanto o processamento de cadeias de caracteres depende da configuração de localidade. Em resumo, as cadeias binárias são apropriadas para armazenar dados que o programador considera como bytes brutos, enquanto as cadeias de caracteres são apropriadas para armazenar texto.

O tipo de dados bytea aceita dois formatos de entrada e saída: o formato hex e o formato escape histórico do PostgreSQL. Ambos são sempre aceitos na entrada. O formato de saída depende do parâmetro de configuração bytea_output; o padrão é hex. (Note que o formato hex foi introduzido no PostgreSQL 9.0; versões anteriores, e algumas ferramentas, não o entendem.)

O padrão SQL define um tipo de dados de cadeia binária diferente, chamada BLOB ou BINARY LARGE OBJECT. O formato de entrada é diferente de bytea, mas as funções e operadores fornecidos são basicamente os mesmos.

8.4.1. Formato hex de bytea

O formato hex codifica dados binários com 2 dígitos hexadecimais por byte, vindo primeiro os 4 bits (nibble) mais significativos. A cadeia inteira é precedida pela sequência \x (para distingui-la do formato de escape). Em alguns contextos, a contrabarra inicial pode precisar de escape duplicando-a (veja Constantes do tipo cadeia de caracteres). Para a entrada, os dígitos hexadecimais podem estar em letras maiúsculas ou minúsculas, sendo permitidos espaços em branco entre pares de dígitos (mas não no meio de um par de dígitos, nem na sequência \x inicial). O formato hexadecimal é compatível com uma ampla gama de aplicações e protocolos externos e tende a ser mais rápido de converter do que o formato de escape, portanto seu uso é o preferido.

Exemplo:

SELECT '\xDEADBEEF';

8.4.2. Formato escape de bytea

O formato escape é o formato tradicional do PostgreSQL para o tipo de dados bytea. Ele usa a abordagem de representar uma cadeia binária como uma sequência de caracteres ASCII, enquanto converte os bytes que não podem ser representados como um caractere ASCII em sequências de escape especiais. Se, do ponto de vista da aplicação, representar bytes como caracteres fizer sentido, essa representação pode ser conveniente. Mas, na prática, é geralmente confuso, porque confunde a distinção entre cadeias binárias e cadeias de caracteres e, também, o mecanismo de escape específico escolhido é um pouco complicado. Portanto, provavelmente esse formato deve ser evitado para a maioria das novas aplicações.

Ao entrar com valores de bytea no formato de escape, octetos com certos valores devem receber escape, enquanto todos os valores de octetos podem receber escape. Em geral, para fazer o escape de um octeto, esse deve ser convertido para o seu valor octal de três dígitos e precedido por uma contrabarra. A própria contrabarra (octeto com valor decimal igual a 92) pode ser representada, como alternativa, por duas contrabarras ('\\'). A Tabela 8.7 mostra os caracteres que devem receber escape, e fornece sequências de escape alternativas quando é aplicável.

Tabela 8.7. Octetos literais bytea com escape

Valor decimal do octetoDescriçãoRepresentação da entrada com escapeExemploRepresentação Hex
0octeto zero'\000''\000'::bytea\x00
39apóstrofos'''' ou '\047'''''::bytea\x27
92contrabarra'\\' ou '\134''\\'::bytea\x5c
0 a 31 e 127 a 255octetos não imprimíveis'\xxx' (valor octal)'\001'::bytea\x01

A necessidade de colocar escape em octetos não imprimíveis varia dependendo da configuração de localidade. Em alguns casos, pode ser evitado deixando-os sem escape.

A razão pela qual os apóstrofos devem ser dobrados, conforme mostrado na Tabela 8.7, é por isso ser verdade para qualquer literal cadeia de caracteres em um comando SQL. O analisador genérico de literal cadeia de caracteres consome os apóstrofos mais externos e reduz qualquer par de apóstrofos a um caractere de dados. O que a função de entrada bytea vê é apenas um apóstrofo, que ela trata como um caractere de dados simples. Entretanto, a função de entrada de bytea trata as contrabarras como sendo especiais, e os outros comportamentos mostrados na Tabela 8.7 são implementados por essa função.

Em alguns contextos, as contrabarras devem ser duplicadas em comparação com o que está mostrado acima, porque o analisador genérico de literal cadeia de caracteres também reduz os pares de contrabarras para um caractere de dados; veja Constantes do tipo cadeia de caracteres.

Por padrão, os octetos bytea são mostrados na saída no formato hex. Se bytea_output for mudado para escape, os octetos não imprimíveis serão convertidos para seus valores octais equivalentes de 3 dígitos e precedidos por uma contrabarra. A maioria dos octetos imprimíveis são mostrados em sua representação padrão no conjunto de caracteres do cliente, como, por exemplo:

SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;

     bytea
----------------
 abc klm *\251T

O octeto com valor decimal 92 (contrabarra) é duplicado na saída. Os detalhes estão na Tabela 8.8.

Tabela 8.8. Octetos bytea com escape na saída

Valor decimal do octetoDescriçãoRepresentação da saída com escapeExemploResultado da saída
92contrabarra\\'\134'::bytea\\
0 a 31 e 127 a 255octetos não imprimíveis\xxx (valor octal)'\001'::bytea\001
32 a 126octetos imprimíveisrepresentação no conjunto de caracteres do cliente'\176'::bytea~

Dependendo da interface usada para acessar o PostgreSQL, pode ser necessário um trabalho adicional para colocar e tirar escape de cadeias bytea. Por exemplo, também pode ser necessário colocar escape em retorno de carro e nova linha (CRLF), se a interface os traduzir automaticamente.

8.4.3. Exemplo

[Exemplo escrito pelo tradutor, não fazendo parte da documentação original]

Exemplo 8.6. Saída de bytea nos formatos Hex e Escape

Nesse exemplo são mostradas as saídas nos formatos Hex e Escape produzidas pela sequência de caracteres 'aàáâã', codificada em UTF-8, convertida para bytea.

SELECT name, setting, short_desc
    FROM pg_settings
    WHERE name='bytea_output';

     name     | setting |            short_desc
--------------+---------+-----------------------------------
 bytea_output | hex     | Sets the output format for bytea.
(1 linha)

SELECT cast('aàáâã' AS bytea),
       bit_length(cast('aàáâã' AS bytea));

        bytea         | bit_length
----------------------+------------
 \x61c3a0c3a1c3a2c3a3 |         72
(1 linha)

SET bytea_output = 'escape';

SELECT name, setting, short_desc
    FROM pg_settings
    WHERE name='bytea_output';

     name     | setting |            short_desc
--------------+---------+-----------------------------------
 bytea_output | escape  | Sets the output format for bytea.
(1 linha)

SELECT cast('aàáâã' AS bytea),
       bit_length(cast('aàáâã' AS bytea));

               bytea               | bit_length
-----------------------------------+------------
 a\303\240\303\241\303\242\303\243 |         72
(1 linha)