Datenbank fetchrow_array fehlgeschlagen lange abgeschnitten DBI-Attribut
bin ich ziehen urls aus meiner Datenbank mit einem perl-Skript, wo ich beschäftigen fetchrow_array zu ziehen-URL aus der Datenbank, die funktionierte gut, bis ich traf eine sehr lange URL georgelog24.blog.iskreni.net/?bid=6744d9dcf85991ed2e4b8a258153a1ab&lid=ff9963b9a798ea335b75b5f7c0c295d1
dann ging es Los, um mir diesen Fehler.
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.
Ich glaube, das ist auf der Datenbank-Seite, wie der code, den ich verwendet haben, ziehen Sie die URL vorher funktioniert hat. Die Datenbank, die ich verwende, ist MSSQL-server 2005.
die URL-Spalte in der Datenbank verwendet text Art momentan, aber ich habe versucht es zu verändern varchar(max) und nvarchar(max) aber der Fehler steht immer noch.
Nach ein bisschen von Versuch und Irrtum habe ich herausgefunden, dass die maximale Länge der url, dann könnte ich die Abfrage erfolgreich mit fetchrow_array war 81 Zeichen. Und da können Sie URLs span lächerlich Längen manchmal, kann ich nicht von einer Beschränkung der URL-Länge.
Kann jemand mir helfen, zu verstehen, und schlage vor, eine Lösung für dieses?
FYI: Zeile 44 ist die erste Zeile in meinem code unten
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
}
InformationsquelleAutor Marcus Lim | 2012-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Sie sich bitte die DBI-Attribute LongTruncOk und LongReadlen
MÜSSEN Sie akzeptieren Sie entweder abschneiden oder legen Sie eine maximale Größe, die als text und varchar(max) - Spalten können Massiv sein also, wenn es Links zu den DBD-es würde keine Wahl haben, aber zu reservieren, riesige Mengen an Speicher in dem Fall die Spalte ist die maximale Größe der Spalte.
InformationsquelleAutor bohica
Versuchen mit:
Außerdem würd ich dir empfehlen, zu versuchen,
Parallel::ForkManager
für die Parallelisierung von jobs - ich finde es viel intuitiver und einfacher zu verwenden als GewindeBtw, nur als Ergänzung, search.cpan.org/~timb/DBI-1.622/DBI.pm#LongReadLen. Ändern Sie den Wert von
LongReadLen
für eine Anweisung handle nachprepare
'd haben in der Regel keine Wirkung, so ist es üblich zu setzenLongReadLen
auf die$dbh
vor dem Aufrufprepare
.InformationsquelleAutor Tudor Constantin
Wichtiger Punkt: müssen Sie die LongReadLen und/oder LongTruncOk Attribute auf die Datenbank-handle vor Vorbereitung der Anweisung, wie erwähnt,hier.
Versuchen, es auf die vorbereitete Anweisung behandeln vor dem abrufen der Daten haben keine Auswirkungen auf das abschneiden der zurückgegebenen Daten.
InformationsquelleAutor Trutane