8

私はperlスクリプトを使用してデータベースからURLをプルしています。ここでは、fetchrow_arrayを使用してデータベースからURLをプルします。これは、非常に長いURLに遭遇するまで正常に機能し、georgelog24.blog.iskreni.net/?bid=6744d9dcf85991ed2e4b8a258153a1ab&lid=ff9963b9a798ea335b75b5f7c0c295d1
その後、このエラーが発生し始めました。

DBD::ODBC::st fetchrow_array failed: st_fetch/SQLFetch (long truncated DBI attribute LongTruncOk not set and/or LongReadLen too small) (SQL-HY000) [state was HY000 now 01004]
[Microsoft][ODBC SQL Server Driver]String data, right truncation (SQL-01004) at C:\test\multihashtest2.pl line 44.

私がURLをプルするために使用していたコードは以前に機能していたので、これはデータベース側にあると思います。私が使用しているデータベースはMSSQLServer2005です。

データベースのURL列は現在テキストタイプを使用していますが、 varchar(max)nvarchar(max )に変更しようとしましたが、エラーが発生します。

少し試行錯誤した結果、URLの最大長がfetchrow_arrayで正常にクエリできることが81文字であることがわかりました。また、URLはばかげた長さにまたがることがあるため、URLの長さに制限を設けることはできません。

誰かが私がこれを理解して修正を提案するのを手伝ってもらえますか?

参考:44行目は以下のコードの最初の行です

while (($myid,$url) = $statement_handle->fetchrow_array()) { # executes as many threads as there are jobs to do 
    my $thread = threads->create(\&webcrawl); #initiate thread
    my $tid = $thread->tid;
    print "  - Thread $tid started\n";   #obtain thread no. and print
    push (@Threads, $thread);   #push thread into array for "housekeeping" later on
}
4

3 に答える 3

13

試してみてください:

#not anymore errors if content is truncated - you don't necessarily want this
$statement_handle->{'LongTruncOk'} = 1;

#nice, hard coded constant for the length of data to be read from Longs
$statement_handle->{'LongReadLen'} = 20000;
while (($myid,$url) = $statement_handle->fetchrow_array()) { # executes as many threads as there are jobs to do 
    my $thread = threads->create(\&webcrawl); #initiate thread
    my $tid = $thread->tid;
    print "  - Thread $tid started\n";   #obtain thread no. and print
    push (@Threads, $thread);   #push thread into array for "housekeeping" later on
}

また、Parallel::ForkManagerジョブの並列化を試してみることをお勧めします-スレッドよりもはるかに直感的で使いやすいと思います

于 2012-09-07T10:09:10.890 に答える
6

DBI属性LongTruncOkLongReadlenを見てください

テキストとして最大サイズを設定するか、最大サイズを設定する必要があります。varchar(max)列は大量になる可能性があるため、DBDに任せた場合、列が最大の場合に大量のメモリを割り当てる以外に選択肢はありません。その列のサイズ。

于 2012-09-07T10:00:30.373 に答える
4

重要なポイント:ここに記載されているように、ステートメントを準備する前に、データベースハンドル にLongReadLen属性やLongTruncOk属性を設定する必要があります。

データをフェッチする前にプリペアドステートメントハンドルに設定しようとしても、返されたデータの切り捨てには影響しません。

于 2015-08-06T03:01:17.473 に答える