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