de fleste databasesystemer giver en datatype, der kan gemme rådata, og postgraduate er ingen undtagelse. Jeg bruger udtrykket rådata til at betyde, at databasen ikke forstår strukturen eller betydningen af en værdi. I modsætning hertil forstår strukturen og betydningen af andre datatyper. Når du f.eks. definerer en HELTALSKOLONNE, ved vi, at de bytes af data, du placerer i den pågældende kolonne, skal repræsentere en heltalsværdi. Ved du, hvad et heltal er?det kan tilføje heltal, multiplicere dem, konvertere dem til og fra strengform osv. Rå data, på den anden side, er bare en samling af bits?Postgraduate kan ikke udlede nogen betydning i dataene.

Postgraduate tilbyder typen BYTEA til lagring af rådata. En BYTEA-kolonne kan teoretisk indeholde værdier af enhver længde, men det ser ud til, at den maksimale længde er 1 GB.

størrelsen af en BYTEA-værdi er 4 bytes plus det faktiske antal bytes i værdien.

syntaks for bogstavelige værdier

indtastning af en BYTEA-værdi kan være lidt vanskelig. En BYTEA bogstavelig indtastes som en streng bogstavelig: det er bare en streng af tegn indesluttet i enkelte citater. I betragtning af det, hvordan indtaster du en BYTEA-værdi, der indeholder et enkelt tilbud? Hvis du ser tilbage på diskussionen om streng bogstavelige værdier (tidligere i dette kapitel), vil du se, at du kan medtage specialtegn i en strengværdi ved at undslippe dem. I særdeleshed, et enkelt citat kan ved undslap på en af tre måder:

  • dobbelt op de enkelte citater (‘dette er et enkelt citat”‘)

  • forud for det enkelte citat med en backslash (‘dette er et enkelt citat \”)

  • Medtag oktalværdien af tegnet i stedet (‘dette er et enkelt citat \047’)

der er to andre tegn, som du skal undslippe, når du indtaster BYTEA-bogstaver. En byte, hvis værdi er nul (ikke tegnet 0, men nullbyte) skal undslippes, og backslash-tegnet skal undslippes. Du kan undslippe ethvert tegn ved hjælp af formularen” \ \ ddd ” (hvor ddd er et oktalt tal). Du kan undslippe ethvert udskrivbart tegn ved hjælp af formularen” \\c”. Så hvis du vil gemme en BYTEA-værdi, der indeholder en nul byte, kan du indtaste den sådan:

'This is a zero byte \000'

hvis du vil gemme en BYTEA-værdi, der indeholder en omvendt skråstreg, kan du indtaste den i en af følgende formularer:

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

hvis du sammenligner disse regler med reglerne for citering af strenglitteraler, vil du bemærke, at BYTEA-bogstaver kræver dobbelt så mange backslash-tegn. Dette er en særhed af designet af postgreskl-parseren. BYTEA-bogstaver behandles af to forskellige parsere. Den vigtigste postgraduate parser ser en BYTEA bogstavelig som en streng bogstavelig (gobbling op det første sæt backslash tegn). Derefter behandler BYTEA-parseren resultatet og Gobbler det andet sæt backslash-tegn op.

så hvis du har en BYTEA-værdi som dette er en backslash\, citerer du den som ‘dette er en backslash \\\\’. Efter at strengparseren har behandlet denne streng, er den blevet omdannet til ‘dette er en backslash \\’. BYTEA-parseren forvandler endelig dette til dette er en backslash \.

understøttede operatører

postgraduate tilbyder en enkelt BYTEA-operatør: sammenkædning. Du kan føje en BYTEA-værdi til en anden BYTEA-værdi ved hjælp af operatoren sammenkædning ( | | ).

Bemærk, at du ikke kan sammenligne to BYTEA-værdier, selv for lighed/ulighed. Du kan selvfølgelig konvertere en BYTEA-værdi til en anden værdi ved hjælp af cast () – operatøren, og det åbner andre operatører.

store objekter

BYTEA-datatypen er i øjeblikket begrænset til lagring af værdier, der ikke er større end 1 GB. Hvis du har brug for at gemme værdier, der er større, end der passer ind i en BYTEA-kolonne, kan du bruge store objekter. Et stort objekt er en værdi, der er gemt uden for en tabel. For eksempel, hvis du vil gemme et fotografi med hver række i din båndtabel, vil du tilføje en OID-kolonne for at holde en henvisning til det tilsvarende store objekt:

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

hver værdi i kolonnen photo_id henviser til en post i systemtabellen pg_largeobject. En JPEG-fil) i pg_largeobject-tabellen:

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

funktionen lo_import() indlæser den navngivne fil i pg_largeobject og returnerer en OID-værdi, der refererer til det store objekt. Nu når du vælger denne række, ser du OID, ikke de faktiske bits, der udgør billedet:

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

hvis du vil skrive billedet tilbage i en fil, kan du bruge funktionen lo_eksport() :

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

hvis du vil se alle store objekter i den aktuelle database, skal du bruge pskl ‘ s \lo_list metacommand:

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

du kan fjerne store objekter fra din database ved hjælp af funktionen lo_unlink ():

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

Hvordan kommer du til de faktiske bits bag reference OID? Kan du ikke?i hvert fald ikke med pl. Understøttelse af store objekter skal være indbygget i den klientapplikation, du bruger. pskl er et tekstorienteret værktøj og har ingen måde at vise et fotografi på, så det bedste du kan gøre er at se på rådataene i pg_largeobject-tabellen. Et par klientapplikationer, såsom arbejdsstationen, understøtter store objekter og kan fortolke rådataene korrekt, i de fleste tilfælde.