こっからは日本語の出力です。
■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できちんと値が取れました!!!!
(^-^;)とりあえず出たので完了とします。。。