Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

'PDOException' mit Meldung 'SQLSTATE[22001]:String data, rechts abgeschnitten:0

Leider

Es ist ein PDO_ODBC 64-Bit-Inkompatibilitätsproblem (#61777 ). , #64824 ) und ohne Zweifel befinden Sie sich auf einem 64-Bit-Build, der es Ihnen nicht erlaubt, Parameter zu binden.

Glücklicherweise

Es hat einen Patch das war zuerst in der Version 5.6 enthalten:

Was ist mit dem von Ihrem PHP gelieferten PDO_ODBC falsch ?

Indem Sie sich einen dieser empfohlenen Patches ansehen:

diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c
index 8b0ccf3..1d275cd 100644
--- a/ext/pdo_odbc/odbc_stmt.c
+++ b/ext/pdo_odbc/odbc_stmt.c
@@ -551,7 +551,7 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
    struct pdo_column_data *col = &stmt->columns[colno];
    RETCODE rc;
    SWORD   colnamelen;
-   SDWORD  colsize;
+   SQLULEN colsize;
    SQLLEN displaysize;

Wir sehen, dass sich nur SDWORD geändert hat (16-Bit-Ganzzahl mit Vorzeichen), die durch den neuen ODBC-Typ SQLULEN ersetzt wird das sind 64 Bit in einer 64-Bit-ODBC-Anwendung und 32 Bit in einer 32-Bit-ODBC-Anwendung .

Ich glaube, der Committer war sich colsize nicht bewusst Datentyp nur da in der allernächsten Zeile SQLLEN richtig definiert ist.

Was soll ich jetzt tun?

  1. Upgrade auf PHP-Version>=5.6
  2. Bleiben Sie bei odbc_* funktioniert als funktionierende Lösung.
  3. Kompilieren Sie PHP v5.5.9 mit bereitgestellten Patches.
  4. Erstellen Sie Ihren eigenen PDO-Wrapper, wie von @GordonM empfohlen