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.
Vélemény, hozzászólás?