většina databázových systémů poskytuje datový typ, který může ukládat nezpracovaná data, a PostgreSQL není výjimkou. Termín surová data používám k tomu, že databáze nerozumí struktuře nebo významu hodnoty. Naproti tomu PostgreSQL rozumí struktuře a významu jiných datových typů. Například, když definujete celý sloupec, PostgreSQL ví, že bajty dat, které umístíte do tohoto sloupce, mají představovat celočíselnou hodnotu. PostgreSQL ví, co je celé číslo?může přidávat celá čísla, násobit je, převádět je do az řetězce a tak dále. Surová data, na druhou stranu, je jen sbírka bitů?PostgreSQL nemůže odvodit žádný význam v datech.

PostgreSQL nabízí Typ BYTEA pro ukládání nezpracovaných dat. Sloupec BYTEA může teoreticky obsahovat hodnoty libovolné délky, ale zdá se, že maximální délka je 1 GB.

velikost hodnoty BYTEA je 4 bajty plus skutečný počet bajtů v hodnotě.

syntaxe pro doslovné hodnoty

Zadání hodnoty BYTEA může být trochu složité. Doslov BYTEA se zadává jako doslovný řetězec: je to jen řetězec znaků uzavřených v jednotlivých uvozovkách. Vzhledem k tomu, jak zadáte hodnotu BYTEA, která obsahuje jednu nabídku? Pokud se podíváte zpět na diskusi o hodnotách doslovných řetězců (dříve v této kapitole), uvidíte, že můžete do hodnoty řetězce zahrnout speciální znaky jejich únikem. Zejména, jeden citát může uniknout jedním ze tří způsobů:

  • zdvojnásobte jednotlivé uvozovky (‚Toto je jediná citace“‚)

  • předchází jeden citát s lomítkem (‚Toto je jeden citát \“)

  • místo toho zahrňte osmičkovou hodnotu znaku (‚Toto je jediná citace \047‘)

existují dva další znaky, které musíte při vstupu uniknoutčajové literály. Bajt, jehož hodnota je nula (ne znak 0, ale null bajt) musí být unikl, a znak zpětného lomítka musí být unikl. Můžete uniknout libovolný znak pomocí formuláře“ \\ddd “ (kde ddd je osmičkové číslo). Pomocí formuláře „\\c“ můžete uniknout jakémukoli tisknutelnému znaku. Pokud tedy chcete uložit hodnotu BYTEA, která obsahuje nulový bajt, můžete ji zadat takto:

'This is a zero byte \000'

pokud chcete uložit hodnotu BYTEA, která obsahuje zpětné lomítko, můžete ji zadat do některého z následujících formulářů:

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

pokud porovnáte tato pravidla s pravidly pro citování řetězcových literálů, všimnete si, že bytea literals vyžadují dvakrát tolik znaků zpětného lomítka. Jedná se o výstřednost návrhu parseru PostgreSQL. BYTEA literals jsou zpracovávány dvěma různými analyzátory. Hlavní analyzátor PostgreSQL vidí doslov BYTEA jako doslovný řetězec (pohlcující první sadu znaků zpětného lomítka). Poté analyzátor BYTEA zpracuje výsledek a pohltí druhou sadu znaků zpětného lomítka.

takže pokud máte hodnotu BYTEA, jako je toto zpětné lomítko \, citujete jej jako ‚ toto je zpětné lomítko \\\\‘. Poté, co analyzátor řetězců zpracuje tento řetězec, byl změněn na ‚ toto je zpětné lomítko \\‘. Analyzátor BYTEA to nakonec přemění na zpětné lomítko \.

Podporované operátory

PostgreSQL nabízí jediný operátor BYTEA: zřetězení. Jednu hodnotu BYTEA můžete připojit k jiné hodnotě BYTEA pomocí operátora zřetězení ( | | ).

Všimněte si, že nelze porovnávat dvě hodnoty BYTEA, a to ani pro rovnost/nerovnost. Pomocí operátoru CAST() můžete samozřejmě převést hodnotu BYTEA na jinou hodnotu a tím se otevírají další operátory.

velké objekty

datový typ BYTEA je v současné době omezen na ukládání hodnot ne větších než 1 GB. Pokud potřebujete uložit hodnoty větší, než se vejde do sloupce BYTEA, můžete použít velké objekty. Velký objekt je hodnota uložená mimo tabulku. Například, pokud chcete uložit fotografii s každým řádkem v tabulce pásky, přidali byste sloupec OID, který by obsahoval odkaz na odpovídající velký objekt:

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

každá hodnota ve sloupci photo_id odkazuje na položku v systémové tabulce pg_largeobject. PostgreSQL poskytuje funkci, která načte externí soubor (například soubor JPEG) do tabulky pg_largeobject:

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

funkce lo_import () načte pojmenovaný soubor do pg_largeobject a vrátí hodnotu OID, která odkazuje na velký objekt. Nyní, když vyberete tento řádek, uvidíte OID, ne skutečné bity, které tvoří fotografii:

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

pokud chcete fotografii zapsat zpět do souboru, můžete použít funkci lo_export() :

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

Chcete-li zobrazit všechny velké objekty v aktuální databázi, použijte metacommand psql \lo_list:

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

velké objekty můžete z databáze odstranit pomocí funkce lo_unlink() :

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

jak se dostanete ke skutečným bitům za referenčním OID? Nemůžeš?alespoň ne s psql. Podpora velkých objektů musí být zabudována do klientské aplikace, kterou používáte. psql je nástroj orientovaný na text a nemá způsob, jak zobrazit fotografii, takže to nejlepší, co můžete udělat, je podívat se na nezpracovaná data v tabulce pg_largeobject. Několik klientských aplikací, jako je pracovní stanice Conjectrix, podporují velké objekty a ve většině případů mohou správně interpretovat nezpracovaná data.