I forgot to say that I am using :
$DBD::Oracle::VERSION = '1.15';

Perl v5.8.5.

Susan
> -----Original Message-----
> From: Susan Cassidy [mailto:[EMAIL PROTECTED]
> Sent: Thursday, October 14, 2004 4:07 PM
> To: [EMAIL PROTECTED]
> Subject: difficulties with utf-8 characters using DBD::Oracle, where works
> using DBD::Pg (PostgreSQL)
> 
> Hello,
> 
> 
> 
> I have a cgi application that works fine using DBD::Pg to insert/select
> data
> from a PostgreSQL using UTF-8 (database created as UNICODE).  We have data
> in multiple languages stored, which has been working fine.
> 
> 
> 
> I have modified the application to use either Oracle or PostgreSQL,
> depending on a config file.  The PostgreSQL part still works fine - web
> page
> shows up correctly (we specify utf-8 encoding in the header), no problems.
> 
> 
> 
> The Oracle way is problematic.
> 
> 
> 
> >From SQLPLUS, it appears that I can INSERT and SELECT data in French, for
> example, and it all looks correct.  The environment in my Linux window has
> these variables:
> 
> NLS_LANG=.UTF8                     ----->   this also works with
> NLS_LANG=AMERICAN_AMERICA.UTF8
> 
> ORACLE_SID=STSDEV1
> 
> ORACLE_BASE=/home/oracle
> 
> LANG=UTF-8
> 
> ORA_NLS33=/home/oracle/product/9.2.0/ocommon/nls/admin/data
> 
> ORACLE_HOME=/home/oracle/product/9.2.0
> 
> 
> 
> I set ORACLE_HOME, ORACLE_SID, ORA_NLS33, and NLS_LANG environment
> variables
> in httpd.conf, and in programs that I run for tests that are not running
> as
> web apps.
> 
> 
> 
> If I connect via DBD::Oracle, I get some of the French special characters
> to
> come out right, and others do not.  I have been told that some (when
> retrieved) are actually encoded in UTF8, and others are Latin1.
> 
> 
> 
> I use the same input data, fetch the same translated data, etc.  The only
> differences that are left seems to be DBD::Oracle, Oracle itself, and the
> environment settings for Oracle.
> 
> 
> 
> I extracted some basic data, known to be utf8, and inserted it into a
> table
> using Oracle SQLLDR.   Then, I retrieved it using a sql script, via
> sqlplus,
> spooling the output to a file.  If I read that file, and output it to a
> web
> page, it looks fine.
> 
> 
> 
> If I read the data via DBD::Oracle, it has garbage characters instead of
> the
> special characters.
> 
> 
> 
> This seems to point to DBD::Oracle being the cause of the problems.
> Perhaps
> some method I need to call that I did not get from the documentation?
> 
> 
> 
> I will append the basic test program below (simple program, instead of
> giant
> application - same type of results):
> 
> 
> 
> Any advice gratefully received.  I have never had so much trouble with a
> DBD
> application, and have used DBD::Oracle before with no trouble.
> 
> 
> 
> Susan Cassidy
> 
> 
> 
> --------------------------------------------------------------------------
> --
> -------------------------------------
> 
> 
> 
> #!/usr/local/bin/perl
> 
> 
> 
> use CGI;
> 
> use DBI;
> 
> 
> 
> our $dbh;
> 
> our $sth;
> 
> 
> 
> $dbuser="xxx";
> 
> $dbpasswd="yyy";
> 
> $dbserver='devsys';
> 
> $db_sid='TEST1';
> 
> 
> 
> 
> 
> #$ENV{NLS_LANG}='AMERICAN_AMERICA.UTF8';
> 
> $ENV{NLS_LANG}='.UTF8';
> 
> $ENV{ORA_NLS33}='/home/oracle/product/9.2.0/ocommon/nls/admin/data';
> 
> $ENV{ORACLE_HOME}='/home/oracle/product/9.2.0';
> 
> 
> 
> $dbh= DBI->connect("dbi:Oracle:host=$dbserver;sid=$db_sid", $dbuser,
> $dbpasswd,
> 
>     {PrintError => 0, AutoCommit => 1}) or  errexit( "Unable to connect to
> $dbserver: $DBI::errstr");
> 
> 
> 
> 
> 
> my $html_hdr=<<"EOF";
> 
> <html>
> 
> <head>
> 
> <title>SYSTRAN - UTF8 Test</title>
> 
> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
> 
> <link rel="stylesheet" href="http://www.systransoft.com/Systran.css";
> type="text/css">
> 
> </head>
> 
> <h3>Sample data</h3>
> 
> <table cellpadding=0 cellspacing=2 border=1>
> 
> EOF
> 
> 
> 
> my $cgi=new CGI;
> 
> print $cgi->header( -charset=>'utf-8');
> 
> print $html_hdr;
> 
> print <<"EOF";
> 
> <tr bgcolor="silver">
> 
> <td>TU</td>
> 
> <td>English</td>
> 
> <td>French</td>
> 
> </tr>
> 
> EOF
> 
> 
> 
>   my (@data);
> 
> 
> 
>   my ($select_stmt)=<<"  EOF";
> 
>   SELECT source, target from test_trans
> 
>   EOF
> 
> 
> 
>   execute_db_statement($select_stmt, __LINE__);
> 
>   while (@data = $sth->fetchrow_array) {
> 
>     foreach (@data) { $_='' unless defined}
> 
>     next if ($data[0] eq '');
> 
>     print '<tr><td>',(join "</td><td>",@data),"</td></tr>\n";
> 
>   }
> 
>   #check for problems with premature termination
> 
>   errexit($sth->errstr) if $sth->err;
> 
> print <<"EOF";
> 
> </table>
> 
> <p>
> 
> </body>
> 
> </html>
> 
> EOF
> 
> exit;
> 
> 
> 
> sub errexit {
> 
>   my (@msg)[EMAIL PROTECTED];
> 
>   print @msg,"\n";
> 
>   exit 1;
> 
> }
> 
> 
> 
> 
> 
> 
> 
> sub execute_db_statement {
> 
>   #this subroutine will prepare and execute a statement for the database,
> 
>   # and errexit if it fails either step
> 
>   my ($statement, $lineno)[EMAIL PROTECTED];
> 
>   my ($rc);
> 
>   #get basic machine info
> 
>   $sth=$dbh->prepare($statement) ||
> 
>     errexit("bad prepare for stmt $statement at line $lineno, error:
> $DBI::errstr");
> 
>   $rc=$sth->execute() ||
> 
>     errexit("can't execute statement:\n$statement\n at line $lineno, ",
> 
>      "return code $rc: DB error: $DBI::errstr");
> 
> } # end sub execute_db_statement


Reply via email to