From: Lou Vanek Date: 2006-01-10T07:50:01+09:00 Subject: Re: ruby-odbc -- Strange Chaning of Special Character in Result Set I tested your script on my system (actually I rewrote portions of it, as shown below), and when the output was sent to bash standard output all extended-ascii characters where output as a simple dash ("-"). This apparently is either a limitation of bash or cygwin. Then I sent the output to a file called "out", and I was able to see the extended-ascii characters. od -c out => 0001500 h a r a c t e r : \t 226 \n C h a shows char(150) as 226, which is octal for 150, so that's right. Gvim shows the accented-u character properly once I set my encoding for extended-ascii (8-bit): :set enc=cp437 The output of the test script as viewed in gvim (cp437 encoding): Selecting the ASCII character for char code 97 [select char(97)] ====================================================================== Character: a Char Code: 97 result array: [["a"]] Selecting the numeric code for char(97) [select ascii(char(97))] ====================================================================== Char Code: 97 Character: a Selecting the ASCII character for char code 150 [select char(150)] ====================================================================== Character: � Char Code: 150 result array: [["\226"]] Selecting the numeric code for char(150) [select ascii(char(150))] ====================================================================== Char Code: 150 Character: � �� # test script ======================================================= #!/usr/bin/ruby require 'odbc' DNS='test' USR='odbcuser' PWD='super_secret_password' connection=ODBC.connect(DNS,USR,PWD) a = [97,150] File.open('out', 'wb') do |wbf| a.each { |c| wbf.puts sql1 = "select char(#{c})" wbf.puts "Selecting the ASCII character for char code #{c} [#{sql1}]" wbf.puts "=" * 70 results1 = connection.run(sql1) results_array1 = results1.fetch_all wbf.puts "Character: \t" + results_array1[0][0] wbf.print "Char Code: \t" wbf.puts results_array1[0][0][0].to_i wbf.puts "result array: #{results_array1.inspect}" wbf.puts results1.drop sql2 = "select ascii(char(#{c}))" wbf.puts "Selecting the numeric code for char(#{c}) [#{sql2}]" wbf.puts "=" * 70 results2 = connection.run(sql2) results_array2 = results2.fetch_all wbf.print "Char Code: \t" wbf.print results_array2[0][0] wbf.puts wbf.puts "Character: \t" + results_array2[0][0].chr wbf.puts results2.drop } wbf.puts "\226\227" #little test end connection.disconnect ------------------------------------------------------------------------------ I didn't get any warnings when compiling ruby-odbc, but I was using gcc 3.4.4. I also ran the ruby-odbc tests and they were all fine. So, in conclusion, at least on cygwin/win xp pro sp2, ruby-odbc seems to work swell. I recommend sending your output to a file and doing something similar to what I've done to see exactly what's being sent back from odbc instead of relying on a (possibly lying) terminal. It would also have been helpful to know which database [and version] you used. -lv Ben wrote: > Hi, > > Some strange behind-the-scenes character conversion appears to be > occuring when fetching ASCII code 150 using ruby-odbc. This is > exempilfied by the script below. It *should* return identical data for > both selects. However, it does not. When char(150) is selected, the > ASCII character code 63 is returned. Not good. :-( > > Server information: > Linux version 2.6.12-10-686-smp (buildd@terranova) (gcc version 3.4.5 > 20050809 (prerelease) (Ubuntu 3.4.4-6ubuntu8)) #1 SMP Fri Nov 18 > 12:27:41 UTC 2005 > ruby 1.8.3 (2005-06-23) [i486-linux] > > > What do y'all think? > > Thanks, > Ben > > === script === > require 'odbc' > > connection=ODBC.connect('dsn','username','password') > > sql1 = 'select char(150)' > puts "Selecting the ASCII character for char code 150 [#{sql1}]" > puts "=" * 70 > results1 = connection.run(sql1) > results_array1 = results1.fetch_all > puts "Character: \t" + results_array1[0][0] > print "Char Code: \t" > print results_array1[0][0][0].to_i > puts > > puts > > sql2 = 'select ascii(char(150))' > puts "Selecting the numeric code for char(150) [#{sql2}]" > puts "=" * 70 > results2 = connection.run(sql2) > results_array2 = results2.fetch_all > print "Char Code: \t" > print results_array2[0][0] > puts > puts "Character: \t" + results_array2[0][0].chr > > > === Output === > Selecting the ASCII character for char code 150 [select char(150)] > ====================================================================== > Character: ? <---- should be blank like the below > Char Code: 63 <---- should be 150 > > Selecting the numeric code for char(150) [select ascii(char(150))] > ====================================================================== > Char Code: 150 > Character: (blank) <---- because the shell window won't display > the em dash