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

There are no ASCII characters over 127. Anything more than that is a system-specific extention.

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

Note: All code is untested, unless otherwise stated

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

Replies are listed 'Best First'.
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 23, 2004 at 21:42 UTC
    OK OK, technically speaking you are correct. However, I don't really care if the 'degree sign' shows up as a little happy face, or even a frowny face, as long as the 'byte' that was read from the oracle database remains true.

      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

        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.

      Actually, degree sign was never \xb6.

        My mistake (dyslexia problems). I meant xba (or 186 decimal).