8.4. Tipos de dado binários

O tipo de dado bytea permite o armazenamento de cadeias binárias; veja a Tabela 8-6 .

Tabela 8-6. Tipos de dado binários

Nome Tamanho de armazenamento Descrição
bytea 4 bytes mais a cadeia binária Cadeia binária de comprimento variável

A cadeia binária é uma seqüência de octetos (ou bytes). As cadeias binárias se distinguem das cadeias de caracteres por duas características: Em primeiro lugar, as cadeias binárias permitem especificamente o armazenamento de octetos com o valor zero e outros octetos "não-imprimíveis" (geralmente octetos fora da faixa 32 a 126). As cadeias de caracteres não permitem octetos zero, e também não permitem outros valores de octeto e seqüências de valores de octeto inválidas de acordo com o conjunto de caracteres da codificação selecionada para o banco de dados. Em segundo lugar, as operações nas cadeias binárias processam os bytes como estão armazenados, enquanto o processamento das cadeias de caracteres dependem da localização definida. Resumindo, as cadeias binárias são apropriadas para armazenar dados que os programadores imaginam como "octetos crus" (raw bytes), enquanto as cadeias de caracteres são apropriadas para armazenar texto.

Ao entrar com valores para bytea octetos com certos valores devem estar numa seqüência de escape (porém, todos os valores de octeto podem estar numa seqüência de escape) quando utilizados como parte do literal cadeia de bytes em uma declaração SQL. Em geral, para construir a seqüência de escape de um octeto este é convertido em um número octal de três dígitos equivalente ao valor decimal do octeto, e precedido por duas contrabarras. A Tabela 8-7 mostra os caracteres que devem estar em uma seqüência de escape, e fornece a seqüência de escape alternativa onde aplicável.

Tabela 8-7. Octetos com seqüência de escape para literais bytea

Valor decimal do octeto Descrição Representação da entrada com escape Exemplo Representação da saída
0 octeto zero '\\000' SELECT '\\000'::bytea; \000
39 apóstrofo '\'' ou '\\047' SELECT '\''::bytea; '
92 contrabarra '\\\\' ou '\\134' SELECT '\\\\'::bytea; \\
0 a 31 e 127 a 255 octetos "não-imprimíveis" '\\xxx' (valor octal) SELECT '\\001'::bytea; \001

A necessidade de colocar os octetos "não-imprimíveis" em uma seqüência de escape varia conforme a localização definida. Em certas circunstâncias podem ser deixados fora de uma seqüência de escape. Deve ser observado que o resultado de todos os exemplos da Tabela 8-7 têm exatamente um octeto de comprimento, muito embora a representação de saída do octeto zero e da contrabarra possuam mais de um caractere.

Exemplo 8-5. Letra acentuada em bytea

Neste exemplo é feita a conversão explícita da cadeia de caracteres aàáâã para o tipo bytea. Os mesmos resultados são obtidos em bancos de dados com conjunto de caracteres LATIN1 e SQL_ASCII, desde que o conjunto de caracteres do cliente seja ISO 8859-1 ou 1252 (Windows). A letra a sem acento é mostrada literalmente, mas as letras acentuadas são mostradas através de valores octais. [1] [2]

=> SELECT cast('aàáâã' AS bytea);

       bytea
-------------------
 a\340\341\342\343
(1 linha)

O motivo pelo qual é necessário escrever tantas contrabarras, conforme mostrado na Tabela 8-7 , é que uma cadeia de caracteres de entrada escrita como um literal cadeia de caracteres deve passar por duas fases de análise no servidor PostgreSQL. A primeira contrabarra de cada par é interpretada como um caractere de escape pelo analisador de literais cadeias de caracteres e portanto consumida, deixando a segunda contrabarra do par. A contrabarra remanescente é então reconhecida pela função de entrada de bytea como o início de um valor octal de três dígitos ou como escape de outra contrabarra. Por exemplo, o literal cadeia de caracteres passado para o servidor como '\\001' se torna '\001' após passar pelo analisador de literais cadeias de caracteres. O '\001' é então enviado para a função de entrada de bytea, onde é convertido em um único octeto com valor decimal igual a 1. Deve ser observado que o caractere apóstrofo não recebe tratamento especial por bytea e, portanto, segue as regras usuais para literais cadeias de caracteres (Veja também a Seção 4.1.2.1 .)

Os octetos bytea também são transformados em seqüências de escape na saída. De uma maneira geral, cada octeto "não-imprimível" é convertido em seu valor octal equivalente de três dígitos, e precedido por uma contrabarra. Os octetos "imprimíveis" são, em sua maioria, representados através de sua representação padrão no conjunto de caracteres do cliente. O octeto com valor decimal 92 (contrabarra) possui uma representação de saída alternativa especial. Os detalhes podem ser vistos na Tabela 8-8 .

Tabela 8-8. Saída dos octetos bytea com escape

Valor decimal do octeto Descrição Representação da saída com escape Exemplo Resultado de saída
92 contrabarra \\ SELECT '\\134'::bytea; \\
0 a 31 e 127 a 255 octetos "não-imprimíveis" \xxx (valor octal) SELECT '\\001'::bytea; \001
32 a 126 octetos "imprimíveis" representação no conjunto de caracteres do cliente SELECT '\\176'::bytea; ~

Dependendo do programa cliente do PostgreSQL utilizado, pode haver trabalho adicional a ser realizado em relação a colocar e retirar escapes das cadeias bytea. Por exemplo, pode ser necessário colocar escapes para os caracteres de nova-linha e retorno-de-carro se a interface realizar a tradução automática destes caracteres.

O padrão SQL define um tipo de cadeia binária diferente, chamado BLOB ou BINARY LARGE OBJECT (objeto binário grande). O formato de entrada é diferente se comparado com bytea, mas as funções e operadores fornecidos são praticamente os mesmos.

Notas

[1]

Exemplo escrito pelo tradutor, não fazendo parte do manual original.

[2]

LATIN1 é a forma de codificação de caracteres especificada na ISO 8859-1. (ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)

SourceForge.net Logo