useimmat tietokantajärjestelmät tarjoavat tietotyypin, joka voi tallentaa raakadataa, eikä PostgreSQL ole poikkeus. Käytän termiä raakadata tarkoittamaan, että tietokanta ei ymmärrä arvon rakennetta tai merkitystä. Sen sijaan PostgreSQL ymmärtää muiden tietotyyppien rakenteen ja merkityksen. Kun esimerkiksi määritellään KOKONAISLUKUSARAKE, PostgreSQL tietää, että kyseiseen sarakkeeseen asetettujen tietojen tavujen oletetaan edustavan kokonaislukuarvoa. PostgreSQL tietää, mikä kokonaisluku on?se voi lisätä kokonaislukuja, kertoa ne, muuntaa ne ja merkkijono muodossa, ja niin edelleen. Raakadata taas on vain bittien kokoelma?PostgreSQL ei voi päätellä mitään merkitystä tiedoista.

PostgreSQL tarjoaa tyypin BYTEA raakadatan tallentamiseen. BYTEA-pylväällä voi teoriassa olla minkä pituisia tahansa arvoja, mutta näyttää siltä, että maksimipituus on 1GB.

BYTEA-arvon koko on 4 tavua plus arvon todellinen tavumäärä.

syntaksi Kirjaimellisille arvoille

BYTEA-arvon syöttäminen voi olla hieman hankalaa. BYTEA-kirjaimisto merkitään merkkijonon kirjaimena: se on vain merkkijono, joka on suljettu yksittäisiin lainausmerkkeihin. Ottaen huomioon, että, miten annat BYTEA arvo, joka sisältää yhden lainaus? Jos palaat keskusteluun merkkijonon kirjaimellisista arvoista (aiemmin tässä luvussa), näet, että voit sisällyttää merkkijonon arvoon erikoismerkkejä pakenemalla niitä. Erityisesti yksi lainaus voi karata yhdellä kolmesta tavasta:

  • kaksinkertaistaa yhden lainausmerkit (”tämä on yksi lainaus”’)

  • edeltää yksittäistä lainausta kääntöviivalla (”tämä on yksittäinen lainaus \”)

  • Sisällytä merkin oktaaliarvo sen sijaan (”Tämä on yksi lainaus \047′)

on olemassa kaksi muuta merkkiä, että sinun täytyy paeta, kun SIIRRYTTÄÄN BYTEA literals. Tavu, jonka arvo on nolla (ei merkki 0, vaan nollatavu) on paettava, ja backslash-merkki on paettava. Voit paeta mistä tahansa merkistä käyttämällä” \\ddd ” – muotoa (jossa ddd on oktaaliluku). Voit paeta mitä tahansa tulostettavaa merkkiä käyttämällä” \\c ” – lomaketta. Joten, jos haluat tallentaa BYTEA arvo, joka sisältää nolla tavu, voit syöttää sen näin:

'This is a zero byte \000'

jos haluat tallentaa BYTEA-arvon, joka sisältää backslashin, voit kirjoittaa sen jommallakummalla seuraavista lomakkeista:

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

jos vertaat näitä sääntöjä merkkijono literals – lainaussääntöihin, huomaat, että BYTEA literals vaatii kaksi kertaa niin monta backslash-merkkiä. Tämä on PostgreSQL-jäsentimen muotoilun oikku. BYTEA literaaleja käsitellään kahdella eri parserilla. Tärkein PostgreSQL jäsennin näkee BYTEA kirjaimellinen kuin merkkijono kirjaimellinen (gobbling ylös ensimmäinen joukko backslash merkkejä). Sitten, BYTEA jäsennin käsittelee tuloksen, gobbling ylös toinen joukko backslash merkkiä.

joten, jos sinulla on BYTEA-arvo, kuten tämä on backslash\, lainaat sitä nimellä ” This is a backslash \\\\”. Kun string jäsennin käsittelee tämän merkkijonon, se on muutettu muotoon ” This is a backslash \\”. BYTEA jäsennin lopulta muuntaa tämän tämä on backslash \.

Tuetut operaattorit

PostgreSQL tarjoaa yhden BYTEA-operaattorin: concatenation. Voit liittää yhden BYTEA-arvon toiseen BYTEA-arvoon käyttämällä konsatenaatio ( / / ) – operaattoria.

huomaa, että kahta BYTEA-arvoa ei voi verrata edes tasa-arvon/epäyhtälön suhteen. Voit tietenkin muuntaa BYTEA-arvon toiseksi arvoksi käyttämällä CAST () – operaattoria, ja se avaa muita operaattoreita.

suurten kohteiden

BYTEA-tietotyyppi rajoittuu tällä hetkellä korkeintaan 1 Gt: n suuruisten tietojen tallentamiseen. Jos haluat tallentaa arvot suurempia kuin mahtuu BYTEA sarake, voit käyttää suuria esineitä. Suuresine on taulukon ulkopuolelle tallennettu arvo. Jos esimerkiksi haluat tallentaa valokuvan jokaisella rivillä nauhataulukossasi, voit lisätä OID-sarakkeeseen viittauksen vastaavaan suuresineeseen:

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

jokainen arvo photo_id-sarakkeessa viittaa kohtaan pg_largeobject-järjestelmätaulukossa. PostgreSQL tarjoaa toiminnon, joka lataa ulkoisen tiedoston (kuten JPEG-tiedoston) pg_largeobject-taulukkoon:

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

lo_import ()-funktio lataa nimetyn tiedoston pg_largeobject-kansioon ja palauttaa OID-arvon, joka viittaa suureen-objektiin. Nyt kun valitset tämän rivin, näet OID: n, ei oikeita bittejä, jotka muodostavat kuvan.:

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

jos haluat kirjoittaa kuvan takaisin tiedostoon, Voit käyttää lo_export () – toimintoa.:

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

jos haluat nähdä kaikki suuret objektit nykyisessä tietokannassa, käytä psql: n \lo_list metacommand-komentoa:

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

voit poistaa suuria objekteja tietokannastasi lo_unlink () – funktiolla:

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

miten päästään viite-OIDIN takana oleviin varsinaisiin bitteihin? Etkö?ainakaan psql: llä. Suuren objektin tuki on rakennettava käyttämääsi asiakassovellukseen. psql on tekstipainotteinen työkalu, eikä sillä ole mahdollisuutta näyttää valokuvaa, joten parasta, mitä voit tehdä, on katsoa raakadataa pg_largeobject-taulukosta. Muutamat asiakassovellukset, kuten Conjectrix-työasema, tukevat suuria objekteja ja pystyvät useimmissa tapauksissa tulkitsemaan raakadataa oikein.