Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi di dato binari
PrecedenteTipi CarattereTipi di Data/OrarioSuccessivo

8.4. Tipi di dato binari

Il tipo di dato bytea consente memorizzazioni di stringhe binarie; Vedere Tabella 8.6, «Tipi di dato binari».

Tabella 8.6. Tipi di dato binari

NomeDimensioneDescrizione
bytea1 o 4 byte più l'attuale stringa binariastringa binaria a lunghezza variabile

Una stringa binaria è una sequenza di ottetti (o byte). Le stringhe binarie si distinguono dalle stringhe di caratteri per due caratteristiche. In primo luogo, le stringhe binarie consentono specificatamente la memorizzazione di ottetti di valore zero e altri ottetti «non-stampabili» (normalmente ottetti al di fuori della gamma da 32 a 126). Le stringhe di caratteri non accettano ottetti zero, e neanche altri valori di ottetti e sequenze di valori di ottetti che non sono validi secondo la codifica del set di caratteri selezionata dal database. In secondo luogo, le operazioni sulle stringhe binarie elaborano i byte reali, mentre l'elaborazione delle stringhe di caratteri dipende dall'impostazione della localizzazione. In breve, le stringhe binarie sono indicate per la memorizzazione di dati che il programmatore ritiene «byte non codificati», mentre le stringhe di caratteri sono indicate per memorizzare testo.

Il tipo bytea supporta 2 formati esterni per l'input e l'output: il formato «escape», storico di PostgreSQL™, e il formato «hex». Ambedue sono accettati in input. Il formato di output dipende dal parametro di configurazione bytea_output; Il default è hex. (Notare che il formato hex è stato introdotto in PostgreSQL™ 9.0; Versioni precedenti ed alcuni strumenti non lo capiscono.)

Lo standard SQL definisce un altro tipo di stringa binaria, chiamato BLOB o BINARY LARGE OBJECT. Il formato di input è diverso da bytea, ma le funzioni e gli operatori messe a disposizione sono per la maggior parte le stesse.

8.4.1. Il formato hex di bytea

Il formato «hex» codifica i dati binari come 2 cifre esadecimali per byte, mettendo prima il nibble più significativo. L'intera stringa è preceduta dalla sequenza \x (per distinguerla dal formato escape). In alcuni contesti, la barra inversa iniziale potrebbe avere bisogno di un escape, quindi va raddoppiata, come nei casi in cui le barre inverse devono essere raddoppiate nel formato escape; Dettagli sotto. Le cifre esadecimali possono essere sia maiuscole che minuscole, e sono permessi spazi bianchi tra coppie di cifre (ma non all'interno di una coppia di cifre e nemmeno nella sequenza iniziale \x ). Il formato hex è compatibile con una vasta gamme di applicazioni e protocolli, e tende ad essere più veloce da convertire rispetto al formato escape, per questo il suo uso è preferibile.

Example:

SELECT E'\\xDEADBEEF';

8.4.2. Il formato escape di bytea

Il formato «escape» è il formato tradizionale di PostgreSQL™ per il tipo bytea. Esso usa l'approccio di rappresentare una stringa binaria come una sequenza di caratteri ASCII, convertendo i byte che non possono essere rappresentati come carattere ASCII in sequence di escape speciali. Se, dal punto di vista dell'applicazione, rappresentare i byte come caratteri ha senso, allora questa rappresentazione può essere conveniente. Ma in pratica, di solito questo è fuorviante, in quanto maschera la distinzione fra stringhe binarie e stringhe di caratteri, inoltre il meccanismo particolare che è stato scelto per l'escape è in qualche modo ingombrante. Per questo, questo formato dovrebbe probabilmente essere evitato per la maggior parte delle nuove applicazioni.

Quando si inseriscono valori bytea in formato escape, ottetti di certi valori devono essere espressi in formato escape, mentre tutti i valori ottetti possono essere espressi in formato escape. In generale, per esprimere un ottetto in formato escape, convertirlo nel suo valore ottale e precederlo da una barra inversa (o due barre inverse, se si sta scrivendo il valore come un valore letterale che usa la sintassi di escape di stringa). La barra inversa di per sè (valore di ottetto 92) può alternativamente essere rappresentata da doppie barre inverse. Tabella 8.7, «Sequenze di escape di ottetti letterali per bytea» mostra i caratteri che devono essere espressi con l'escape, e mostra le sequenze di escape alternative dove sono applicabili.

Tabella 8.7. Sequenze di escape di ottetti letterali per bytea

Valore decimale ottettoDescrizioneRappresentazione sequenza di escape in ingressoEsempioRappresentazione in uscita
0ottetto 0E'\\000'SELECT E'\\000'::bytea;\000
39apice singolo'''' or E'\\047'SELECT E'\''::bytea;'
92barra inversaE'\\\\' or E'\\134'SELECT E'\\\\'::bytea;\\
da 0 a 31 e da 127 a 255ottetti «non stampabili»E'\\xxx' (valore ottale)SELECT E'\\001'::bytea;\001

La necessità di codificare le sequenze di escape per gli ottetti «non stampabili» varia a seconda dell'impostazione locale. In alcuni casi è possibile cavarsela senza dover fare l'escape. Notare che il risultato in ognuno degli esempi in Tabella 8.7, «Sequenze di escape di ottetti letterali per bytea» è esattamente della lunghezza di un ottetto, anche se la rappresentazione d'uscita degli ottetti a volte è maggiore di un carattere.

La ragione per cui bisogna scrivere diverse barre inverse, come mostrato nella Tabella 8.7, «Sequenze di escape di ottetti letterali per bytea», è che una stringa in input, scritta come stringa letterale, deve passare attraverso due fasi di analisi nel server PostgreSQL™. La prima barra inversa di ogni paio viene interpretata come un carattere di escape dall'analizzatore di stringhe letterali (assumendo che si stia utilizzando la sintassi di escape per le stringhe) e viene quindi eliminata, lasciando invariata la seconda barra inversa del paio. (Per eliminare questo livello di decodifica del carattere di escape è possibile utilizzare le stringhe racchiuse tra caratteri dollaro). La barra inversa rimasta viene quindi riconosciuta dalla funzione di input di bytea o come inizio di un valore ottale di tre cifre, oppure come un'altro carattere barra inversa di escape. Per esempio, una stringa letterale passata al server come E'\\001' diventa \001 dopo essere passata attraverso l'analizzatore di sequenze di escape. Il valore \001 viene quindi passato alla funzione di input di bytea, dove viene convertito in un singolo ottetto con valore decimale 1. Notare che il carattere racchiuso tra singoli-apici non viene specificatamente trattato da bytea per cui segue le regole normali per le stringhe letterali. (Vedere anche Sezione 4.1.2.1, «Costanti stringa»).

Gli ottetti di Bytea a volte vengono codificati come sequenze di escape in uscita. Generalmente ogni ottetto «non-stampabile» viene convertito nel suo equivalente valore ottale a tre cifre e preceduto da una barra inversa. La maggior parte degli ottetti «stampabili» vengono rappresentati nella loro rappresentazione standard nel set di caratteri del client. L'ottetto con valore decimale 92 (barra inversa) viene raddoppiato in uscita. Maggiori dettagli in Tabella 8.8, «Ottetti di bytea con escape in uscita».

Tabella 8.8. Ottetti di bytea con escape in uscita

Valore decimale ottettoDescrizioneRappresentazione sequenza di escape in uscitaEsempioRisultato in uscita
92barra inversa\\SELECT E'\\134'::bytea;\\
0 to 31 and 127 to 255ottetti «non stampabili»\xxx (valore ottale)SELECT E'\\001'::bytea;\001
32 to 126ottetti «stampabili»rappresentazione in base al set di caratteri del clientSELECT E'\\176'::bytea;~

In base al front end di PostgreSQL™ utilizzato, potrebbe essere necessario fare del lavoro aggiuntivo sulla codifica e la decodifica delle sequenze di escape per le stringhe di bytea. Per esempio, si potrebbe anche dover fare l'escape per l'accapo e per il ritorno carrello se la vostra interfaccia non li trasforma automaticamente.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi di dato binari
PrecedenteTipi CarattereTipi di Data/OrarioSuccessivo