majoritatea sistemelor de baze de date oferă un tip de date care poate stoca date brute, iar PostgreSQL nu face excepție. Folosesc termenul date brute pentru a însemna că baza de date nu înțelege structura sau semnificația unei valori. În schimb, PostgreSQL înțelege structura și semnificația altor tipuri de date. De exemplu, când definiți o coloană întreagă, PostgreSQL știe că octeții de date pe care îi plasați în acea coloană ar trebui să reprezinte o valoare întreagă. PostgreSQL știe ce este un număr întreg?se poate adăuga numere întregi, le multiplica, le converti la și de la forma șir, și așa mai departe. Datele brute, pe de altă parte, sunt doar o colecție de biți?PostgreSQL nu poate deduce niciun sens în date.

PostgreSQL oferă tipul BYTEA pentru stocarea datelor brute. O coloană BYTEA poate deține teoretic valori de orice lungime, dar se pare că lungimea maximă este de 1 GB.

dimensiunea unei valori BYTEA este de 4 octeți plus numărul real de octeți din valoare.

sintaxa pentru valorile literale

introducerea unei valori BYTEA poate fi un pic dificil. Un bytea literal este introdus ca un șir literal: este doar un șir de caractere închise în ghilimele simple. Având în vedere că, cum introduceți o valoare BYTEA, care include un singur citat? Dacă vă uitați înapoi la discuția despre valorile literale ale șirului (mai devreme în acest capitol), veți vedea că puteți include caractere speciale într-o valoare a șirului scăpându-le. În special, un singur citat poate de scăpat într-una din cele trei moduri:

  • dublați ghilimelele unice (‘acesta este un singur citat”‘)

  • Precede citatul unic cu un backslash (‘acesta este un singur citat \”)

  • includeți în schimb valoarea octală a personajului (‘acesta este un singur citat \047’)

există alte două personaje pe care trebuie să scape atunci când intră literali BYTEA. Un octet a cărui valoare este zero (nu caracterul 0, ci octetul nul) trebuie scăpat, iar caracterul backslash trebuie scăpat. Puteți scăpa de orice personaj folosind formularul” \\ddd ” (unde ddd este un număr octal). Puteți scăpa de orice caracter imprimabil folosind formularul” \\c”. Deci, dacă doriți să stocați o valoare BYTEA care include un octet zero, puteți să o introduceți astfel:

'This is a zero byte \000'

dacă doriți să stocați o valoare BYTEA care include un backslash, îl puteți introduce în oricare dintre următoarele forme:

'This is a backslash \\''This is also a backslash \134'

dacă comparați aceste reguli cu regulile pentru citarea literalelor șirurilor, veți observa că literalele BYTEA necesită de două ori mai multe caractere backslash. Acesta este un aspect al designului parserului PostgreSQL. Literalele BYTEA sunt procesate de doi analizatori diferiți. Parserul principal PostgreSQL vede un bytea literal ca un șir literal (înghițind primul set de caractere backslash). Apoi, parserul BYTEA procesează rezultatul, înghițind al doilea set de caractere backslash.

deci, dacă aveți o valoare BYTEA, cum ar fi acesta este un backslash\, îl citați ca ‘acesta este un backslash \\\\’. După ce parserul șir procesează acest șir, acesta a fost transformat în ‘acesta este un backslash \\’. Parserul BYTEA transformă în cele din urmă acest lucru în acesta este un backslash \.

operatori suportați

PostgreSQL oferă un singur operator BYTEA: concatenare. Puteți adăuga o valoare BYTEA la o altă valoare BYTEA folosind operatorul concatenare ( / / ).

rețineți că nu puteți compara două valori BYTEA, chiar și pentru egalitate/inegalitate. Puteți, desigur, converti o valoare BYTEA într-o altă valoare folosind CAST() operator, și care deschide alți operatori.

obiecte mari

tipul de date BYTEA este limitat în prezent la stocarea valorilor care nu depășesc 1 GB. Dacă aveți nevoie pentru a stoca valori mai mari decât se va potrivi într-o coloană BYTEA, puteți utiliza obiecte mari. Un obiect mare este o valoare stocată în afara unui tabel. De exemplu, dacă doriți să stocați o fotografie cu fiecare rând în tabelul benzi, ar adăuga o coloană OID să dețină o referință la corespunzătoare mare obiect:

movies=# ALTER TABLE tapes ADD COLUMN photo_id OID;ALTER

fiecare valoare din coloana photo_id se referă la o intrare în tabelul de sistem pg_largeobject. PostgreSQL oferă o funcție care va încărca un fișier extern (cum ar fi un fișier JPEG) în tabelul pg_largeobject:

movies=# INSERT INTO tapes VALUESmovies-# (movies(# 'AA-55892',movies(# 'Casablanca',movies(# lo_import('/tmp/casablanca.jpg' )movies(# );

lo_import() funcția încarcă fișierul numit în pg_largeobject și returnează o valoare OID care se referă la mare obiect. Acum, când selectați acest rând, vedeți OID, nu biții reali care alcătuiesc fotografia:

movies=# SELECT * FROM tapes WHERE title = 'Casablanca'; tape_id | title | photo_id----------+------------+---------- MC-68873 | Casablanca | 510699

dacă doriți să scrieți fotografia înapoi într-un fișier, puteți utiliza funcția lo_export ():

movies=# SELECT lo_export( 510699, '/tmp/Casablanca.jpg' ); lo_export----------- 1(1 row)

pentru a vedea toate obiectele mari din Baza de date curentă, Utilizați metacommand \lo_list psql:

movies=# \lo_list Large objects ID | Description--------+------------- 510699 |(1 row)

puteți elimina obiecte mari din Baza de date utilizând funcția lo_unlink ():

movies=# SELECT lo_unlink( 510699 ); lo_unlink----------- 1(1 row)movies=# \lo_list Large objects ID | Description----+-------------(0 rows)

cum ajungeți la biții reali din spatele OID-ului de referință? Nu poți?cel puțin nu cu psql. Suportul pentru obiecte mari trebuie să fie încorporat în aplicația client pe care o utilizați. psql este un instrument orientat spre text și nu are nicio modalitate de a afișa o fotografie, deci cel mai bun lucru pe care îl puteți face este să vă uitați la datele brute din tabelul pg_largeobject. Câteva aplicații client, cum ar fi stația de lucru Conjectrix, acceptă obiecte mari și pot interpreta corect datele brute, în majoritatea cazurilor.