PerlのDBI/DBD::ODBCで 「String data, right truncated (SQL-01004)」 エラー
PerlでDBI(DBD::ODBC)経由でデータベースにアクセスしたところ、検索結果をフェッチするところで
というエラーが出て止まってしまいました。
メッセージによると、LongTruncOk が設定されていないか LongReadLen が小さすぎたかのどちらか(もしくは両方)とのことなので、対処法を調べてみました。
まずは LongTruncOk と LongReadLen とは何ぞや? というところなんですが、これ、DBIデータベースハンドルオブジェクトのプロパティなんですね。
ですので、以下の要領で値を参照したり設定したりすることができます。
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect("data_source","user_name","password"); # 値の参照 print "LongReadLen is '", $dbh->{LongReadLen}, "'\n"; print "LongTruncOk is '", $dbh->{LongTruncOk}, "'\n"; # 値の設定 $dbh->{LongReadLen} = 160; $dbh->{LongTruncOk} = 1;
ちなみにそれぞれの初期値については、LongReadLen が 80(単位はバイト)で、LongTruncOk が false(正確には空の文字列?)がセットされています。
各プロパティの詳しい意味については DBI のドキュメント を読んでいただくとして、要はフェッチするために必要なバッファが小さかったのがエラーの原因なので、先に LongReadLen に大きめの値を設定しておけば、ちゃんとフェッチしてくれます。
また、LongTruncOk に true(0 や 空の文字列 や undef でない何か)を設定しておくと、バッファに取り込める分だけ取り込んで(残りは破棄して)、エラーにせずにフェッチ処理を続行させる事ができます。
参考リンク
・Perl DBI - dbi.perl.org
・DBI - search.cpan.org
・Introduction to retrieving data from your database - Perl DBI/DBD::ODBC Tutorial Part 2
・perl - Database fetchrow_array failed long truncated DBI attribute - Stack Overflow
・RE: DBD-ODBC/MS SQL Server - right truncation error « perl-win32-database « ActiveState List Archives