Re: DBD::Oracle - is ora_lob_read mangling BLOB data?

John Scoles <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Organization The Pythian Group
Message-ID <[email protected]>
I will have a look at it tomorrow as you gave me a good example.

The latest version is ready to go out the door but I can delay it a 
little more as I look into it.

Cheers
John Scoles

Milo van der Leij wrote:
> My apologies.  I am seeing this behavior with DBD::Oracle versions 
> 1.17 and 1.22
>
>     ----- Original Message -----
>     From: "John Scoles"
>     To: "Milo van der Leij"
>     Cc: [email protected]
>     Subject: Re: DBD::Oracle - is ora_lob_read mangling BLOB data?
>     Date: Thu, 26 Mar 2009 06:43:32 -0400
>
>     Can you tell us which version of DBD::Oracle you are using. There
>     is quite a differance between versions when it comes to UTF8
>     handling.
>
>     Milo van der Leij wrote:
>     > I am in the progress of changing some code that uses DBD::Oracle
>     > to use the documented ora_lob_read function instead of the
>     > undocumented blob_read, and I suddenly hit the error "Malformed
>     > UTF-8 character (unexpected end of string) in length".
>     >
>     > As it turns out, Perl's length function returns the number of
>     > characters in the string. If Perl thinks the string contains
>     > text and the text is in utf-8, then this can be different from
>     > the number of bytes in the string. I regret to say that I am
>     > very unfamiliar with how Perl handles utf-8, but I am familiar
>     > enough with Oracle to see that treating BLOB data as character
>     > data is incorrect.
>     >
>     > I see the call to SvUTF8_on in ora_lob_read in Oracle.xs, I see
>     > how the value of NLS_LANG plays in, and I see how it affects both
>     > CLOB and BLOB data, so I understand why I am getting the result I
>     > am getting. But I have some questions:
>     >
>     > (For someone who understands utf-8 in Perl:) Is there danger in
>     > binary data being treated as utf-8, other than the length
>     > function crashing? Is there a workaround? (I see "use bytes",
>     > but Perl 5.10 doc for the length function says "the internal
>     > encoding is variable, and the number of bytes usually
>     > meaningless" which scares me.)
>     >
>     > (For someone who understands the stuff in Oracle.xs:) Is it even
>     > possible to change ora_lob_read to only call SvUTF8_on for CLOB
>     > data and not for BLOB data?
>     >
>     > My test case is included below. Connection info will need to be
>     > altered before it runs. Commenting out the line with AL32UTF8
>     > makes the problem go away.
>     >
>     > use strict;
>     > use DBI;
>     > use DBD::Oracle qw(:ora_types);
>     >
>     > $ENV{'NLS_LANG'} = '_.AL32UTF8';
>     > my $hDB = DBI->connect('dbi:Oracle:TEST', 'SCOTT', 'TIGER');
>     >
>     > my $hSQL = $hDB->prepare(qq{
>     > DECLARE
>     > b blob;
>     > BEGIN
>     > dbms_lob.createtemporary(b,true);
>     > dbms_lob.writeappend(b,256,utl_raw.xrange('00','FF'));
>     > :b := b;
>     > END;
>     > }, { ora_auto_lob => 0 });
>     >
>     > my $b;
>     > $hSQL->bind_param_inout( ':b', \$b, 0, { ora_type => ORA_BLOB } );
>     > $hSQL->execute;
>     >
>     > my $data = $hDB->ora_lob_read( $b, 1, 1024 );
>     > print "Read ", length($data), " bytes.\n";
>     >
>     >
>     >
>
>
> -- 
> Be Yourself @ mail.com!
> Choose From 200+ Email Addresses
> Get a *Free* Account at www.mail.com <http://www.mail.com/Product.aspx>!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.