Hi everybody,
excuse my naive question please...
Is it possible that binding of binary data-type (bytea) without
data-type specification would behave like in MySQL in some future
versions of DBD::Pg? Binding binary values works correctly without type
specification in DBD::mysql.
z...@bobek:~/pokusy/devel/perl/dbi$ ./mysql-blob
synthetized binary value: 0x0201000102
data from database: 0x0201000102
z...@bobek:~/pokusy/devel/perl/dbi$ ./pg-blob
synthetized binary value: 0x0201000102
>>> WITHOUT bind_param type spec...
data from database: 0x0201
>>> WITH bind_param type spec...
data from database: 0x0201000102
>>> WITH quoted value...
quoted value: E'\\002\\001\\000\\001\\002'
data from database: 0x0201000102
This need of special care for columns of the type bytea is probably the
reason a module DBIx::SearchBuilder method BinarySafeBLOBs definition.
The BinarySafeBLOBs method is defined returning true for
Informix, ODBC, mysql
and returning false for
Oracle, Pg, SQLite, Sybase.
The result is a need for base64 or quoted-printable encoding of non-UTF8
data of column type text (Attachments.Content) of Request Tracker
application..
Best Regards
--
Zito
#!/usr/bin/env perl
use strict;
use DBI;
my $dbh = DBI->connect('dbi:mysql:zito', undef, undef,
{
'RaiseError' => 1,
'AutoCommit' => 1,
}
);
$dbh->do('CREATE TEMPORARY TABLE b ( b longblob )');
my $v = pack('H*', '0201000102');
print "\nsynthetized binary value: 0x", unpack('H*', $v), "\n\n";
#DBI->trace(5);
$dbh->do('INSERT INTO b VALUES (?)', undef, $v);
#DBI->trace(0);
my ($a) = $dbh->selectrow_array('SELECT * FROM b');
print "data from database: 0x", unpack('H*', $a), "\n";
print "\n";
$dbh->disconnect();
#!/usr/bin/env perl
use strict;
use DBI;
use DBD::Pg qw(PG_BYTEA);
my $dbh = DBI->connect('dbi:Pg:dbname=zito', undef, undef,
{
'RaiseError' => 1,
'AutoCommit' => 1,
}
);
$dbh->do('CREATE TEMP TABLE b ( b bytea )');
my $v = pack('H*', '0201000102');
print "\nsynthetized binary value: 0x", unpack('H*', $v), "\n\n";
print ">>> WITHOUT bind_param type spec...\n";
#DBI->trace(100);
$dbh->do('INSERT INTO b VALUES (?)', undef, $v);
#DBI->trace(0);
my ($a) = $dbh->selectrow_array('SELECT * FROM b');
print "data from database: 0x", unpack('H*', $a), "\n";
print "\n";
$dbh->do('DELETE FROM b');
print ">>> WITH bind_param type spec...\n";
my $sth = $dbh->prepare('INSERT INTO b VALUES (?)');
$sth->bind_param(1, $v, { pg_type => PG_BYTEA });
$sth->execute();
my ($a) = $dbh->selectrow_array('SELECT * FROM b');
print "data from database: 0x", unpack('H*', $a), "\n";
print "\n";
$dbh->do('DELETE FROM b');
print ">>> WITH quoted value...\n";
my $qv = $dbh->quote($v, { pg_type => PG_BYTEA });
print "quoted value: $qv\n";
$dbh->do("INSERT INTO b VALUES ($qv)");
my ($a) = $dbh->selectrow_array('SELECT * FROM b');
print "data from database: 0x", unpack('H*', $a), "\n";
print "\n\n";
$dbh->disconnect();