a legtöbb adatbázis-rendszer olyan adattípust biztosít, amely nyers adatokat képes tárolni, és ez alól a PostgreSQL sem kivétel. A nyers adatok kifejezést arra használom, hogy az adatbázis nem érti az érték szerkezetét vagy jelentését. Ezzel szemben a PostgreSQL megérti más adattípusok szerkezetét és jelentését. Például, ha egész oszlopot határoz meg, a PostgreSQL tudja, hogy az oszlopba helyezett bájtoknak egész értéket kell képviselniük. A PostgreSQL tudja, mi az egész szám?egész számokat adhat hozzá, megszorozhatja őket, konvertálhatja őket karakterlánc formába és így tovább. A nyers adatok viszont csak bitek gyűjteménye?A PostgreSQL nem tud következtetni az adatok jelentésére.

a PostgreSQL a bytea típust kínálja a nyers adatok tárolására. A BYTEA oszlop elméletileg bármilyen hosszúságú értékeket tartalmazhat, de úgy tűnik, hogy a maximális hossz 1 GB.

a bájtérték mérete 4 bájt plusz az érték tényleges bájtszáma.

a literális értékek szintaxisa

a BYTEA érték megadása kissé trükkös lehet. A BYTEA literal karakterláncként kerül beírásra: ez csak egy karakterlánc, amely egyetlen idézőjelbe van zárva. Tekintettel arra, hogy hogyan adhat meg egy bytea értéket, amely egyetlen idézetet tartalmaz? Ha visszatekint a karakterlánc szó szerinti értékeinek tárgyalására (a fejezet korábbi részében), látni fogja, hogy speciális karaktereket is felvehet egy karakterlánc értékébe, ha elkerüli őket. Különösen, egyetlen idézet lehet által megszökött háromféle módon:

  • duplázza meg az egyes idézeteket (‘ez egyetlen idézet”‘)

  • előzze meg az egyetlen idézetet fordított perjellel (‘ez egyetlen idézet \”)

  • tartalmazza a karakter oktális értékét (‘ez egyetlen idézet \047’)

két másik karakter van, amelyet el kell menekülnie a BYTEA literálok beírásakor. Egy bájtot, amelynek értéke nulla (nem a 0 karakter, hanem a null bájt) el kell kerülni, a fordított karaktert pedig el kell kerülni. Bármely karakter elől elmenekülhet a “\\ddd” űrlap segítségével (ahol a ddd oktális szám). A “\\c” űrlap segítségével bármilyen nyomtatható karaktert elkerülhet. Tehát, ha egy bytea értéket szeretne tárolni, amely nulla bájtot tartalmaz, akkor ezt így írhatja be:

'This is a zero byte \000'

ha olyan bytea értéket szeretne tárolni, amely fordított perjelet tartalmaz, az alábbi űrlapok egyikében adhatja meg:

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

ha összehasonlítja ezeket a Szabályokat a karakterlánc-literálok idézésének szabályaival, észreveszi, hogy a BYTEA literálok kétszer annyi fordított karaktert igényelnek. Ez a PostgreSQL elemző kialakításának furcsasága. A BYTEA literálokat két különböző elemző dolgozza fel. A fő PostgreSQL elemző a BYTEA literal-t string literal-nak tekinti (a backslash karakterek első készletének felnyalása). Ezután a BYTEA elemző feldolgozza az eredményt, felzabálva a backslash karakterek második sorozatát.

tehát, ha van egy BYTEA értéke, mint például ez egy backslash\, akkor idézni, mint ‘ez egy backslash\\\’. Miután a karakterlánc-elemző feldolgozta ezt a karakterláncot, ‘ez egy fordított perjel \\’lett. A BYTEA elemző végül átalakítja ezt ez egy backslash \.

támogatott operátorok

a PostgreSQL egyetlen BYTEA operátort kínál: összefűzés. Az összefűzés (||) operátor segítségével az egyik BÁJTEA értéket hozzáfűzi egy másik BÁJTEA értékhez.

vegye figyelembe, hogy nem lehet összehasonlítani két BYTEA értékek, még az egyenlőség / egyenlőtlenség. Természetesen a cast() operátorral konvertálhat egy BYTEA értéket egy másik értékre, amely megnyitja a többi operátort.

nagy objektumok

a BYTEA adattípus jelenleg legfeljebb 1 GB-os értékek tárolására korlátozódik. Ha nagyobb értékeket kell tárolnia, mint amennyi egy BYTEA oszlopba illeszkedik, használhat nagy objektumokat. A nagy objektum egy táblán kívül tárolt érték. Ha például egy fényképet szeretne tárolni a szalagok táblázatának minden sorával, akkor adjon hozzá egy OID oszlopot, hogy hivatkozást tartson a megfelelő nagy objektumra:

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

a photo_id oszlop minden értéke a pg_largeobject rendszertábla egyik bejegyzésére utal. A PostgreSQL olyan funkciót biztosít, amely külső fájlt (például JPEG fájlt) tölt be a pg_largeobject táblába:

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

a lo_import() függvény betölti a megnevezett fájlt a pg_largeobject fájlba, és visszaad egy OID értéket, amely a nagy objektumra utal. Most, amikor ezt a sort választja, az OID-T látja, nem pedig a fényképet alkotó tényleges biteket:

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

ha vissza szeretné írni a fényképet egy fájlba, használhatja a lo_export () függvényt:

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

az aktuális adatbázis összes nagyobjektumának megtekintéséhez használja a psql \lo_list metacommand-ját:

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

a nagy objektumokat eltávolíthatja az adatbázisból a lo_unlink () függvény segítségével:

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

Hogyan juthat el a referencia OID mögötti tényleges bitekhez? Nem tudsz?legalábbis a psql esetében nem. A nagyobjektum-támogatást be kell építeni a használt ügyfélalkalmazásba. a psql egy szövegorientált eszköz, amelynek nincs módja fénykép megjelenítésére, ezért a legjobb, ha megnézi a nyers adatokat a pg_largeobject táblában. Néhány kliens alkalmazás, mint például a Conjectrix Workstation, támogatja a nagy objektumokat, és a legtöbb esetben megfelelően tudja értelmezni a nyers adatokat.