sql >> Databasteknik >  >> RDS >> Sqlserver

'PDOException' med meddelandet 'SQLSTATE[22001]:Strängdata, höger trunkerad:0

Tyvärr,

Det är en PDO_ODBC 64-bitars inkompatibilitetsproblem (#61777 , #64824 ) och utan några tvivel är du på en 64-bitars build som inte tillåter dig att binda parametrar.

Lyckligtvis

Den har en patch som först inkluderades i version 5.6:

Vad är fel med din PHP-levererade PDO_ODBC ?

Genom att titta på en av dessa rekommenderade patchar:

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 att det enda som har ändrats är SDWORD (16-bitars heltal med tecken) som ersätts med ny ODBC-typ SQLULEN det vill säga 64 bitar i en 64-bitars ODBC-applikation och 32 bitar i en 32-bitars ODBC-applikation .

Jag tror att committer inte var medveten om colsize datatyp endast sedan på nästa rad SQLLEN är korrekt definierad.

Vad ska jag göra nu?

  1. Uppgradera till PHP-version>=5.6
  2. Håll dig med odbc_* fungerar som en fungerande lösning.
  3. Kompilera en PHP v5.5.9 med medföljande patchar.
  4. Bygg ditt eget PDO-omslag enligt rekommendationerna av @GordonM


  1. Hur hittar man summan av flera kolumner i en tabell i SQL Server 2005?

  2. foreach %dopar% + RPostgreSQL

  3. Hur hittar man luckor i sekventiell numrering i mysql?

  4. Docker compose mysql-anslutning misslyckas