sql >> Base de Datos >  >> RDS >> Sqlserver

'PDOException' con el mensaje 'SQLSTATE[22001]:datos de cadena, truncados a la derecha:0

Desafortunadamente,

Es un PDO_ODBC Problema de incompatibilidad de 64 bits (#61777 , #64824 ) y sin ninguna duda estás en una compilación de 64 bits que no te permite enlazar parámetros.

Afortunadamente,

Tiene parche que se incluyó por primera vez en la versión 5.6:

¿Qué tiene de malo el PDO_ODBC enviado de PHP? ?

Mirando uno de esos parches recomendados:

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;

Vemos que lo único que ha cambiado es SDWORD (entero con signo de 16 bits) que se sustituye por el nuevo tipo ODBC SQLULEN es decir 64 bits en una aplicación ODBC de 64 bits y 32 bits en una aplicación ODBC de 32 bits .

Creo que el autor no estaba al tanto de colsize tipo de datos solo porque en la siguiente línea SQLLEN se define correctamente.

¿Qué debo hacer ahora?

  1. Actualizar a la versión de PHP>=5.6
  2. Quédese con odbc_* funciona como una solución de trabajo.
  3. Compila un PHP v5.5.9 con los parches provistos.
  4. Cree su propia envoltura de PDO según lo recomendado por @GordonM