5.4. Tipo para cadeias binárias

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

Tabela 5-6. Tipo para cadeias binárias

Nome do tipoArmazenamentoDescrição
bytea4 bytes mais a cadeia bináriaCadeia binária de comprimento variável (sem limite específico)

A cadeia binária é uma seqüência de octetos (ou bytes). As cadeias binárias se diferenciam das cadeias de caracteres por duas características: Em primeiro lugar as cadeias binárias permitem o armazenamento de octetos com o valor zero, além de outros octetos "não imprimíveis". Em segundo lugar, as operações nas cadeias binárias processam os bytes armazenados, enquanto o processo de codificação das cadeias de caracteres depende das configurações regionais.

Ao entrar com valores para bytea, octetos com certos valores devem possuir uma seqüência de escape (porém, todos os valores de octeto podem possuir uma seqüência de escape) quando utilizado como parte da cadeia literal na 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. Alguns valores de octeto possuem seqüências de escape alternativas, como mostrado na Tabela 5-7.

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

Valor decimal do octetoDescriçãoEntrada com seqüência de escapeExemploResultado impresso
0octeto zero'\\000'SELECT '\\000'::bytea;\000
39apóstrofo'\'' ou '\\047'SELECT '\''::bytea;'
92contrabarra'\\\\' ou '\\134'SELECT '\\\\'::bytea;\\

Observe que o resultado de cada um dos exemplos da Tabela 5-7 tem um octeto de comprimento, embora a representação de contrabarra do octeto zero possua mais de um caractere. A saída dos octetos de bytea também possui seqüência de escape. De modo geral, cada octeto com valor decimal "não imprimível" é convertido em um número octal equivalente de três dígitos, e precedido por uma contrabarra. A maioria dos octetos "imprimíveis" é representada por sua representação padrão no conjunto de caracteres do cliente. O octeto com valor decimal 92 (contrabarra) possui uma representação alternativa especial. Os detalhes estão na Tabela 5-8.

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

Valor decimal do octetoDescriçãoRepresentação com seqüência de escape da saídaExemploResultado impresso
92contrabarra\\SELECT '\\134'::bytea;\\
0 a 31 e 127 a 255octetos "não imprimíveis"\### (valor octal)SELECT '\\001'::bytea;\001
32 a 126octetos "imprimíveis"representação ASCIISELECT '\\176'::bytea;~

Para utilizar a notação de octeto com seqüência de escape em bytea, os literais (cadeias de caracteres de entrada) devem conter duas contrabarras, porque passam por dois analisadores no servidor PostgreSQL. A primeira contrabarra é interpretada como caractere de escape pelo analisador de cadeia de caracteres, sendo por este consumida, deixando os caracteres seguintes. A contrabarra restante é reconhecida pela função de entrada de bytea como sendo o prefixo de um valor octal de três dígitos. Por exemplo, a cadeia de caracteres passada para o servidor como '\\001' se torna '\001' após passar pelo analisador de 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.

Pela mesma razão, uma contrabarra deve ser entrada como '\\\\' (ou '\\134'). A primeira e a terceira contrabarras são interpretadas como caractere de escape pelo analisado de cadeia de caracteres e, portanto, são consumidas, deixando duas contrabarras na cadeia de caracteres passada para a função de entrada de bytea, que as interpreta como sendo uma única contrabarra. Por exemplo, a cadeia de caracteres passada para o servidor como '\\\\' se torna '\\' após passar pelo analisador de cadeias de caracteres. A '\\' é então enviada para a função de entrada de bytea, onde é convertida em um único octeto com valor decimal igual a 92.

O apóstrofo é um pouco diferente porque precisa ser entrado como '\'' (ou '\\047'), e não como '\\''. Isto acontece porque enquanto o analisador de literais interpreta o apóstrofo como caractere especial, removendo a única contrabarra, a função de entrada de bytea não reconhece o apóstrofo como sendo um octeto especial. Portanto, uma cadeia de caracteres passada para o servidor como '\'' se torna ''' após passar pelo analisador de cadeias de caracteres. O ''' é enviado em seguida para a função de entrada de bytea onde, então, é retido o valor decimal igual a 39 do seu único octeto.

Dependendo do programa cliente do PostgreSQL utilizado, pode haver trabalho adicional a ser realizado em relação aos escapes das cadeias de caracteres 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. Do mesmo modo pode ser necessário duplicar as contrabarras se o analisador utilizado também trata a contrabarra como caractere de escape.

O padrão SQL define um tipo diferente de cadeia de caracteres binária, chamada 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.