Perl DBI (MySQL) setzt in der vorbereiteten Anweisung einen einzelnen Anführungsstrich anstatt eines tatsächlichen Parameters ein

8

Ich versuche eine einfache Abfrage als vorbereitete Anweisung auszuführen, habe aber keinen Erfolg. Hier ist der Code:

%Vor%

Der MySQL Server antwortet mit einem Syntaxfehler near ''' .

Die Ausgabe des DBI-Trace zeigt

an %Vor%

Für mich sieht es so aus, als würde die Aussage nicht so vorbereitet, wie sie sollte. Wenn ich die Abfrage ohne den Parameter sende, funktioniert es wie erwartet.

Was vermisse ich hier?

Die DBI-Version ist DBI 1.637-ithread , die MySQL-Version ist 5.5.57-0+deb8u1

Getestet mit Windows perl 5, version 26, subversion 1 (v5.26.1) built for MSWin32-x86-multi-thread-64int
und Ubuntu perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi

Bearbeiten1:
Für den Kontext: Ich habe das Problem bei der Verwendung von Catalyst mit Catalyst::Plugin::Session::Store::DBIC . Hier ist die ID-Spalte ein Varchar (72) -Typ, der eine Session-ID enthält.

Bearbeiten2:

  • DBD :: mysql-Version ist 4.043
  • Die Bindung über $sth->execute('session:foo'); führt zum selben Problem
  • Die Bindung über $sth->bind_param('session:foo', SQL_VARCHAR); führt zum selben Problem
  • Die Bindung eines numerischen Feldes funktioniert, aber nur mit der expliziten Typdefinition $sth->bind_param(1, 1512407082, SQL_INTEGER);

Bearbeiten3:
Ich habe die Zeit gefunden, weitere Tests durchzuführen, aber nicht mit befriedigenden Ergebnissen:

  • Ich konnte mit einem älteren Server testen und es hat funktioniert. Die Versionen von DBI und DBD :: mysql sind die gleichen, aber ich habe den Server mit MySQL 5.5 Client gefunden, der im DBI-Trace als MYSQL_VERSION_ID 50557 angegeben wurde, während meine beiden ursprünglichen Testserver MySQL 5.7 MYSQL_VERSION_ID 50720 und MYSQL_VERSION_ID 50716 verwenden.
  • mit $dbh->{mysql_server_prepare} = 1; klappt es! Vielleicht hilft das jemand, der diese q findet, aber ich würde jetzt lieber die eigentliche Ursache des Problems machen
deR_Ed 04.12.2017, 10:41
quelle

1 Antwort

3

Nach einigen Tests kam ich zu dem Schluss, dass dies ein Kompatibilitätsproblem zwischen DBD :: mysql und MySQL Client 5.7 (und / oder ) zu sein scheint MySQL Server 5.5 ).

Zumindest habe ich eine Lösung für Ubuntu 16 (xenial) gefunden, also für andere, die auf dasselbe Problem stoßen könnten:

  • Downgrade auf MySQL 5.6 wie hier beschrieben hier . Für mich war die Installation von libmysqlclient-dev ohne den Server / Client ausreichend
  • installieren Sie DBD :: MySQL sudo cpanm --reinstall DBD::mysql neu, damit es mit dem nun installierten MySQL 5.6
  • erstellt wird

Ich werde ein Problem im DBD :: mysql GitHub einreichen und werde diese Antwort aktualisieren, falls es solche gibt irgendwelche Nachrichten bezüglich dieses Problems.

Eine alternative Lösung, die auch bei mir funktioniert hat:
Lassen Sie den Server Ihre Anweisung $dbh->{mysql_server_prepare} = 1;

vorbereiten     
deR_Ed 05.12.2017, 16:17
quelle

Tags und Links