in reply to Re: Re: DBD:ODBC does not return characters with ascii value > 128 correctly (5.8.2 on Solaris -> 5.6.1 on Windows works)
in thread DBD:ODBC does not return characters with ascii value > 128 correctly (5.8.2 on Solaris -> 5.6.1 on Windows works)

Are you sure the data coming back really is mangled incorrectly? It could be that your shell is trying to interpret it and outputs garbage. Try running the string through ord (which gives you the base-10 value of each char) like this:

my $str = "abcdef"; my @nums = map ord, split //, $str; print join ' ', @nums;

The above is tested, though perhaps overly-golfed for to make a good answer :)

----
: () { :|:& };:

Note: All code is untested, unless otherwise stated

  • Comment on Re: Re: Re: DBD:ODBC does not return characters with ascii value > 128 correctly (5.8.2 on Solaris -> 5.6.1 on Windows works)
  • Select or Download Code

Replies are listed 'Best First'.
Re: Re: Re: Re: DBD:ODBC does not return characters with ascii value > 128 correctly (5.8.2 on Solaris -> 5.6.1 on Windows works)
by Sandy (Curate) on Feb 24, 2004 at 15:01 UTC
    Mmmmm, I should have mentioned that my 1st attempt at problem solving was to create a string using the chr function and printing the result to the console. This worked ok.

    However, I will include another code test snippet here for clarification.

    use DBI; use DBD::ODBC; my $username = shift; my $password = shift; my $oracle_db = shift; # --- Get data from DB $dbh = DBI->connect("DBI:ODBC:$oracle_db","$username","$password") or die ("Could not make connection to database:\n". "$DBI::errstr\n"); $dbh->{RaiseError} = 1; my $sql_statement = 'SELECT A.LABEL, A.COMMENTS FROM mydb.table WHERE A.LABEL = ?'; $parm_cursor = $dbh->prepare ( $sql_statement ); $parm_cursor->execute('MYLABEL'); (my $label, my $comment) = $parm_cursor->fetchrow_array(); # --- Verify output from DB print "$comment\n"; my @nums = map ord, split //, $comment; print join ' ', @nums,"\n"; # --- Verify that console can print a degree sign my $str = "30 degrees = 30".chr(186); @nums = map ord, split //, $str; print "$str\n"; print join ' ', @nums,"\n";
    And the output is: (Solaris. Perl 5.8.2)
    INITIAL VALUE IS 0.0? 73 78 73 84 73 65 76 32 86 65 76 85 69 32 73 83 32 48 46 48 63 30 degrees = 30º 51 48 32 100 101 103 114 101 101 115 32 61 32 51 48 186
    And the output is: (Windows. Perl 5.6.1)
    (The degree sign actually doesn't look like a degree symbol, it looks like a double-vertical-line, but I really don't care.)
    INITIAL VALUE IS 0.0º; 73 78 73 84 73 65 76 32 86 65 76 85 69 32 73 83 32 48 46 48 186 30 degrees = 30º; 51 48 32 100 101 103 114 101 101 115 32 61 32 51 48 186
    Is this a bug or a feature??

    I can't reinstall perl 5.6.1 on Solaris to check it (the CM and QA people would shoot me!), but I am beginning to think that this is not a Windows/Solaris difference, but a difference between perl 5.6.1 and 5.8.2.

      I am beginning to think that this is not a Windows/Solaris difference, but a difference between perl 5.6.1 and 5.8.2.

      Possibly. The Unicode handling code in perl was totally redone between those releases. There were tricks you had to do in 5.6, but 5.8 should make it completely transparent.

      Sorry, I don't have many more insights to offer than that.

      ----
      : () { :|:& };:

      Note: All code is untested, unless otherwise stated