De fleste databasesystemer gir en datatype som kan lagre rådata, Og PostgreSQL er ikke noe unntak. Jeg bruker begrepet rådata til å bety at databasen ikke forstår strukturen eller betydningen av en verdi. I motsetning Forstår PostgreSQL strukturen og betydningen av andre datatyper. Når Du for eksempel definerer EN HELTALLSKOLONNE, Vet PostgreSQL at byte med data som du plasserer i den kolonnen, skal representere en heltallsverdi. PostgreSQL vet hva et heltall er?det kan legge heltall, multiplisere dem, konvertere dem til og fra streng form, og så videre. Rådata, derimot, er bare en samling av biter?PostgreSQL kan ikke utlede noen mening i dataene.

PostgreSQL tilbyr typen BYTEA for lagring av rådata. EN BYTEA-kolonne kan teoretisk holde verdier av lengde, men det ser ut til at maksimal lengde ER 1GB.

STØRRELSEN på EN BYTEA-verdi er 4 byte pluss det faktiske antall byte i verdien.

Syntaks For Bokstavelige Verdier

Å Skrive inn EN BYTEA-verdi kan være litt vanskelig. EN BYTEA literal er angitt som en streng bokstavelig: Det er bare en streng av tegn vedlagt i enkelt anførselstegn. Gitt det, hvordan skriver du inn EN BYTEEN verdi som inkluderer et enkelt sitat? Hvis du ser tilbake til diskusjonen om streng bokstavelig verdier (tidligere i dette kapittelet), vil du se at du kan inkludere spesialtegn i en strengverdi ved å unnslippe dem. Spesielt kan et enkelt sitat ved rømt på en av tre måter:

  • Doble opp enkelt sitater (‘Dette er et enkelt sitat»‘)

  • Forut for enkelt sitat med en backslash (‘Dette er et enkelt sitat \»)

  • Inkluder oktalverdien av tegnet i stedet (‘Dette Er et enkelt sitat \047’)

det er to andre tegn som du må unnslippe når du skriver INN BYTEA bokstaver. En byte hvis verdi er null (ikke tegnet 0, men nullbyte) må rømmes, og backslash-tegnet må rømmes. Du kan unnslippe alle tegn ved hjelp av» \\ddd » form (der ddd er et oktaltall). Du kan unnslippe noen utskrivbare tegn ved hjelp av» \\c » skjema. Så, hvis du vil lagre EN BYTEA-verdi som inneholder en nullbyte, kan du skrive den inn slik:

'This is a zero byte \000'

Hvis du vil lagre EN BYTEA-verdi som inneholder en skråstrek, kan du angi den i ett av følgende skjemaer:

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

hvis du sammenligner disse reglene med reglene for å sitere strenglitteraler, vil DU legge merke til AT BYTEA-bokstaver krever dobbelt så mange backslash-tegn. Dette er en innfall av utformingen Av PostgreSQL parser. BYTEA-bokstaver behandles av to forskjellige parsere. Den Viktigste PostgreSQL parser ser EN BYTEA bokstavelig som en streng bokstavelig (buldre opp det første settet med skråstrek tegn). DERETTER behandler BYTEA parser resultatet, buldre opp det andre settet med skråstrek tegn.

Så, hvis DU har EN BYTEA verdi som Dette er en backslash\, siterer du det som ‘ Dette er en backslash\\\\’. Etter at strengparseren behandler denne strengen, har den blitt omgjort til ‘ This is a backslash \\’. BYTEA-parseren forvandler til Slutt dette Til This is a backslash \.

Støttede Operatører

PostgreSQL tilbyr en ENKELT BYTEA-operatør:sammenkobling. Du kan legge til EN BYTEA-verdi til en ANNEN BYTEA-verdi ved hjelp av sammenkoblingsoperatoren ( | | ).

Merk at du Ikke kan sammenligne TO BYTEA-verdier, selv for likestilling / ulikhet. Du kan selvfølgelig konvertere EN BYTEA-verdi til en annen verdi ved HJELP AV cast () – operatøren, og det åpner andre operatører.

Store Objekter

BYTEA-datatypen er for øyeblikket begrenset til lagring av verdier som ikke er større ENN 1 GB. Hvis du trenger å lagre verdier større enn vil passe inn I EN BYTEA kolonne, kan du bruke store objekter. Et stort objekt er en verdi som er lagret utenfor en tabell. Hvis du for eksempel vil lagre et bilde med hver rad i tapes-tabellen, legger du til EN oid-kolonne for å holde en referanse til det tilsvarende store objektet:

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

hver verdi i photo_id-kolonnen refererer til en oppføring i pg_largeobject – systemtabellen. PostgreSQL gir en funksjon som vil laste en ekstern fil (for eksempel EN JPEG-fil) inn i pg_largeobject-tabellen:

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

lo_import () – funksjonen laster den navngitte filen inn i pg_largeobject og returnerer EN oid-verdi som refererer til large-objektet. Nå NÅR DU VELGER denne raden, ser DU OID, ikke de faktiske biter som utgjør bildet:

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

hvis du vil skrive bildet tilbake til en fil, kan du bruke lo_export () – funksjonen:

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

hvis du vil se alle store objekter i gjeldende database, bruker du psql \lo_list metacommand:

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

du kan fjerne store objekter fra databasen ved hjelp av lo_unlink () – funksjonen:

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 bitene bak referansen OID? Kan du ikke?i hvert fall ikke med psql. Støtte for store objekter må bygges inn i klientprogrammet du bruker. psql er et tekstorientert verktøy og har ingen måte å vise et fotografi på, så det beste du kan gjøre er å se på rådataene i pg_largeobject-tabellen. Noen få klientprogrammer, for eksempel Conjectrix Workstation, støtter store objekter og kan tolke rådataene riktig, i de fleste tilfeller.