O tipo de dados bytea
permite o armazenamento de
cadeias binárias;
veja a Tabela 8.6.
Tabela 8.6. Tipo binário
Nome | Tamanho de armazenamento | Descrição |
---|---|---|
bytea | 1 ou 4 bytes mais a cadeia binária real | cadeia 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.
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';
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 octeto | Descrição | Representação da entrada com escape | Exemplo | Representação Hex |
---|---|---|---|---|
0 | octeto zero | '\000' | '\000'::bytea | \x00 |
39 | apóstrofos | '''' ou '\047' | ''''::bytea | \x27 |
92 | contrabarra | '\\' ou '\134' | '\\'::bytea | \x5c |
0 a 31 e 127 a 255 | octetos “não imprimíveis” | '\ (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 octeto | Descrição | Representação da saída com escape | Exemplo | Resultado da saída |
---|---|---|---|---|
92 | contrabarra | \\ | '\134'::bytea | \\ |
0 a 31 e 127 a 255 | octetos “não imprimíveis” | \ (valor octal) | '\001'::bytea | \001 |
32 a 126 | octetos “imprimíveis” | representaçã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.
[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)