こっからは日本語の出力です。

SQLを日本語の入っているテーブルに変更して実行

my $sth = $dbh->prepare("select top 10 * from test_table<span style="color:#FF0000;">_jp</span>") or die $dbh->errstr;

何か途中で落ちる。。。

■カラムを指定して実行

my $sth = $dbh->prepare("select top 10 id,name from test_table_jp") or die $dbh->errstr;

無事日本語も表示されました。

(-ω-???????
どうやら型の中に「varchar(max)」があると落ちるようです。

http://www.mail-archive.com/dbi-users@perl.org/msg26962.html
↑パッチらしきものを発見

■diffにそってソースを修正後makeし直します。

vim /root/.cpan/build/DBD-ODBC-1.15/dbdimp.c

make clean
perl Makefile.PL
make
make test
make install

結果は同じでした。。。

デバッグに入ります。
まずはエラーを拾います。
http://www.rfs.jp/sb/perl/dbi/03.html
↑ここに「DBI->trace」こんなん載ってた。

デバッグレベルを変更します。

my $dbh = DBI->connect('dbi:ODBC:freetds', 'sa', '1ndivision',{PrintError=>0,AutoCommit=>0}) or die $!;
$dbh->trace(3);

デバッグ最強レベルまで上げる。

その結果。エラー文のような物がはかれました。
怪しい部分だけ抜き出します。

     now using col 1: type = CHAR (1), len = 20, display size = 21, prec = 20, scale = 0
     now using col 2: type = VARCHAR (12), len = 800, display size = 801, prec = 800, scale = 0
     now using col 3: type = LONG VARCHAR (-1), len = 258048, display size = 81, prec = 258048, scale = 0

col3がvarchar(max)部分になります。
display size が他のカラムに比べて少なすぎます。

ほかのカラムはlen+1 サイズになってるのに
varchar(max)のカラムはやたらと少ないです。

C言語経験者に頼る。。。。orz

「dbdimp.c」をデバッグする

case文にデバッグ入れ込んでみるとvarchar(max)の場合
「LONG VARCHAR」として判定されている事が判明!!

以下の関数部分を修正。

#vim /root/.cpan/build/DBD-ODBC-1.15/dbdimp.c

dbd_describe(h, imp_sth, more)関数の下部分のcase文の中にif文追加


          case SQL_LONGVARCHAR:
            if (fbh->ColDef <= 0) {
                fbh->ColDisplaySize = DBIc_LongReadLen(imp_sth)+1;
            }
            break;

修正しました。

#make install
#perl odbc.pl


now using col 3: type = LONG VARCHAR (-1), len = 258048, display size = 258049, prec = 258048, scale = 0


出ました!!!
fetchできちんと値が取れました!!!!

(^-^;)とりあえず出たので完了とします。。。