(PHP 4 >= 4.2.0, PHP 5, PHP 7)

pg_escape_bytea Gera binários para o tipo bytea


string pg_escape_bytea ( string $data )

pg_escape_bytea() gera uma string do tipo bytea. Retorna uma string com escapes.


Quando você usa SELECT bytea type, o PostgreSQL retorna valores de byte octais prefixados por \ (ex.: \032). Usuários devem converter de volta para binários por si mesmos.

Esta função exige PostgreSQL 7.2 ou superior. Com PostgreSQL 7.2.0 e 7.2.1, o tipo de dados bytea deve ser criado quando você habilita o suporte a multi-byte. Por exemplo, INSERT INTO tabela_teste (imagem) VALUES ('$imagem_escaped'::bytea); PostgreSQL 7.2.2 ou superior não precisa de coerção (cast). A exceção é quando a codificação de caracteres do cliente e do backend não combinam, então pode haver erro de fluxo de multi-byte. O usuário deve fazer a coerção (cast) para bytea para evitar este erro.

Veja também: pg_unescape_bytea() e pg_escape_string().

add a note add a note

User Contributed Notes 7 notes

ynzhang from lakeheadu of ca
9 years ago
The reason pg_unescape_bytea() do not exactly reproduce the binary data created by pg_escape_bytea() is because the backslash \ and single quote ' are double escaped by the pg_escape_bytea() function. This will lead to image seems corrupted when retrieve from the bytea field. The proper way to escape&unescape a binary string into a PG bytea field as follow:

= str_replace(array("\\\\", "''"), array("\\", "'"), pg_escape_bytea($data));
/* and later unescape the escaped data from the bytea field with following to get the original binary data */

$original_data = pg_unescape_bytea($escaped_data));

more details at:
7 years ago
To prevent any problems with encoding you could use hexadecimal or base64 input to save and retrieve data to the database:

// Connect to the database
$dbconn = pg_connect( 'dbname=foo' );
// Read in a binary file
$data = file_get_contents( 'image1.jpg' );
// Escape the binary data
$escaped = bin2hex( $data );
// Insert it into the database
pg_query( "INSERT INTO gallery (name, data) VALUES ('Pine trees', decode('{$escaped}' , 'hex'))" );

// Get the bytea data
$res = pg_query("SELECT encode(data, 'base64') AS data FROM gallery WHERE name='Pine trees'"); 
$raw = pg_fetch_result($res, 'data');
// Convert to binary and send to the browser
header('Content-type: image/jpeg');
14 years ago
to unescape_bytea use stripcslashes(). If you need to escape bytea and don't have pg_escape_bytea() function then use:

function escByteA($binData) {
   * \134 = 92 = backslash, \000 = 00 = NULL, \047 = 39 = Single Quote
   * str_replace() replaces the searches array in order. Therefore, we must
   * process the 'backslash' character first. If we process it last, it'll
   * replace all the escaped backslashes from the other searches that came
   * before.
$search = array(chr(92), chr(0), chr(39));
$replace = array('\\\134', '\\\000', '\\\047');
$binData = str_replace($search, $replace, $binData);
//echo "<pre>$binData</pre>";
Hayley Watson
8 months ago
PostgreSQL 9.0 introduced a new hexadecimal-based representation for bytea data that is preferred over the escaping mechanism implemented by this function.

function pg_escape_byteahex($binary)
gglockner AT NOSPAMdwaffler DOT com
8 years ago
If you're getting errors about nonstandard use of \\ in a string literal, then you need to escape the encoded bytea as follows:

= pg_escape_bytea($data);
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped'::bytea)");
4 years ago
using  pg_escape_bytea without 'E' escape tag
// Die Binärdaten maskieren
$escaped = pg_escape_bytea($data);

// und in die Datenbank einfügen (falsch/wrong)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped')");

// und in die Datenbank einfügen (richtig/right)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '$escaped')");
php at tobias dot olsson dot be
15 years ago
if you need to change back bytea from the db to normal data, this will do that:

function pg_unescape_bytea($bytea) {
return eval(
"return \"".str_replace('$', '\\$', str_replace('"', '\\"', $bytea))."\";");

// use like this
$rs = pg_query($conn, "SELECT image from images LIMIT 1");
$image = pg_unescape_bytea(pg_fetch_result($rs, 0, 0));

To Top