8.4. Tipos de dado binários

O tipo de dado bytea permite o armazenamento de cadeias binárias; consulte 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), enquanto as cadeias de caracteres não permitem o octeto com valor zero, e também não permitem outros valores de octeto e seqüências de valores de octeto inválidos para 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 depende do idioma definido. Resumindo, as cadeias binárias são apropriadas para armazenar dados que os programadores imaginam como "bytes brutos" (raw bytes [1] ), enquanto as cadeias de caracteres são apropriadas para armazenar texto.

Ao se entrar com valores para bytea, os octetos com certos valores devem ser colocados em uma seqüência de escape (porém, todos os valores de octeto podem ser colocados em uma seqüência de escape), quando utilizados como parte de um literal cadeia de bytes em uma declaração SQL. Em geral, para construir a seqüência de escape de um octeto o mesmo é 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 ser colocados em uma seqüência de escape, e fornece seqüências de escape alternativas 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 o idioma definido. 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. [2] [3]

=> \!chcp 1252
Active code page: 1252
=> 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 (Consulte 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]

raw — [informática, computadores] — s. bruto; no estado original ou não processado — adj. cru; bruto; não cozido; não beneficiado. raw | Portuguese | Dictionary & Translation by Babylon (N. do T.)

[2]

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

[3]

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 CSS válido!