de flesta databassystem ger en datatyp som kan lagra rådata, och PostgreSQL är inget undantag. Jag använder termen rådata för att betyda att databasen inte förstår strukturen eller betydelsen av ett värde. Däremot förstår PostgreSQL strukturen och betydelsen av andra datatyper. När du till exempel definierar en HELTALSKOLUMN vet PostgreSQL att byte av data som du placerar i den kolumnen ska representera ett heltal. PostgreSQL vet vad ett heltal är?det kan lägga till heltal, multiplicera dem, konvertera dem till och från strängform, och så vidare. Rådata, å andra sidan, är bara en samling bitar?PostgreSQL kan inte härleda någon mening i data.

PostgreSQL erbjuder typen BYTEA för lagring av rådata. En bytea-kolumn kan teoretiskt hålla värden av vilken längd som helst, men det verkar som om den maximala längden är 1 GB.

storleken på ett BYTEA-värde är 4 byte plus det faktiska antalet byte i värdet.

Syntax för bokstavliga värden

att ange ett BYTEA-värde kan vara lite knepigt. En BYTEA bokstav anges som en sträng bokstavlig: det är bara en sträng av tecken inneslutna i enstaka citat. Med tanke på det, hur anger du ett BYTEA-värde som innehåller ett enda citat? Om du tittar tillbaka till diskussionen om strängens bokstavliga värden (tidigare i det här kapitlet) ser du att du kan inkludera specialtecken i ett strängvärde genom att undkomma dem. I synnerhet kan ett enda citat av flydde på ett av tre sätt:

  • dubbla upp de enskilda citaten (’Detta är ett enda citat”’)

  • föregå det enda citatet med ett backslash (’Detta är ett enda citat \”)

  • inkludera det oktala värdet av tecknet istället (’Detta är ett enda citat \047’)

det finns två andra tecken som du måste fly när du går in ite bokstäver. En byte vars värde är noll (inte tecknet 0, men null byte) måste rymmas och backslash-tecknet måste rymmas. Du kan undvika alla tecken med hjälp av” \\ddd ” – formuläret (där ddd är ett oktalt tal). Du kan undvika alla utskrivbara tecken med hjälp av” \ \ c ” – formuläret. Så om du vill lagra ett BYTEA-värde som innehåller en nollbyte kan du ange det så här:

'This is a zero byte \000'

om du vill lagra ett BYTEA-värde som innehåller ett backslash kan du ange det i något av följande formulär:

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

om du jämför dessa regler med reglerna för att citera strängbokstäver märker du att BYTEA-bokstäver kräver dubbelt så många backslash-tecken. Detta är en quirk av designen av PostgreSQL-parsern. BYTEA bokstäver bearbetas av två olika parsers. Den huvudsakliga PostgreSQL-parsern ser en BYTEA bokstavlig som en sträng bokstavlig (gobbling upp den första uppsättningen backslash-tecken). Sedan bearbetar BYTEA-parsern resultatet och slukar upp den andra uppsättningen backslash-tecken.

så om du har ett BYTEA-värde som detta är ett backslash \, citerar du det som ’detta är ett backslash \\\\’. Efter att strängparsern har bearbetat den här strängen har den förvandlats till ’detta är ett backslash\\’. BYTEA parser förvandlar slutligen detta till detta är en backslash \.

operatörer som stöds

PostgreSQL erbjuder en enda bytea-operatör: sammankoppling. Du kan lägga till ett BYTEA-värde till ett annat BYTEA-värde med operatören concatenation ( / / ).

Observera att du inte kan jämföra två BYTEA-värden, även för jämlikhet/ojämlikhet. Du kan naturligtvis konvertera ett BYTEA-värde till ett annat värde med operatören CAST (), och det öppnar andra operatörer.

stora objekt

datatypen BYTEA är för närvarande begränsad till att lagra värden som inte är större än 1 GB. Om du behöver lagra värden som är större än vad som passar in i en bytea-kolumn kan du använda stora objekt. Ett stort objekt är ett värde som lagras utanför en tabell. Om du till exempel vill lagra ett fotografi med varje rad i tapes-tabellen lägger du till en oid-kolumn för att hålla en referens till motsvarande stora objekt:

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

varje värde i kolumnen photo_id refererar till en post i systemtabellen pg_largeobject. PostgreSQL tillhandahåller en funktion som laddar en extern fil (till exempel en JPEG-fil) i tabellen pg_largeobject:

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

funktionen lo_import() laddar den namngivna filen i pg_largeobject och returnerar ett OID-värde som refererar till det stora objektet. Nu när du väljer den här raden ser du OID, inte de faktiska bitarna som utgör fotot:

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

om du vill skriva tillbaka fotot till en fil kan du använda funktionen lo_export() :

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

för att se alla stora objekt i den aktuella databasen, använd PSQL ’ s \lo_list metacommand:

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

du kan ta bort stora objekt från din databas med funktionen lo_unlink() :

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

Hur kommer du till de faktiska bitarna bakom referens-OID? Kan du inte?åtminstone inte med psql. Stöd för stora objekt måste vara inbyggt i klientapplikationen som du använder. psql är ett textorienterat verktyg och har inget sätt att visa ett fotografi, så det bästa du kan göra är att titta på rådata i tabellen pg_largeobject. Några klientapplikationer, som Conjectrix Workstation, stöder stora objekt och kan tolka rådata korrekt, i de flesta fall.