sql >> Database teknologi >  >> RDS >> Sqlserver

'PDOException' med beskeden 'SQLSTATE[22001]:Strengdata, højre trunkeret:0

Desværre,

Det er en PDO_ODBC 64-bit inkompatibilitetsproblem (#61777 , #64824 ) og uden tvivl er du på en 64-bit build, som ikke tillader dig at binde parametre.

Heldigvis

Den har en patch som først blev inkluderet i 5.6-udgivelsen:

Hvad er der galt med din PHP's afsendte PDO_ODBC ?

Ved at se på en af ​​de anbefalede patches:

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;

Vi ser, at det eneste, der er ændret, er SDWORD (16-bit fortegnet heltal), som erstattes med ny ODBC type SQLULEN det er 64 bit i en 64-bit ODBC-applikation og 32 bit i en 32-bit ODBC-applikation .

Jeg tror, ​​at committer ikke var klar over colsize datatype kun siden i den allernæste linje SQLLEN er defineret korrekt.

Hvad skal jeg gøre nu?

  1. Opgrader til PHP-version>=5.6
  2. Bliv ved med odbc_* fungerer som en fungerende løsning.
  3. Kompiler en PHP v5.5.9 med medfølgende patches.
  4. Byg din egen BOB-indpakning som anbefalet af @GordonM


  1. Få værdierne for de sidste 6 måneder i mysql

  2. Sådan får du vist forespørgselsudførelsesplanen i Azure Data Studio (SQL-server)

  3. alternativ til mysql_field_name i mysqli

  4. får værdier, der ikke findes i mysql-tabellen