Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

'PDOException' com mensagem 'SQLSTATE[22001]:String data, truncado à direita:0

Infelizmente,


É um PDO_ODBC Problema de incompatibilidade de 64 bits (#61777 , #64824 ) e sem dúvidas você está em uma compilação de 64 bits que não permite vincular parâmetros.

Felizmente,


Tem um patch que foi incluído pela primeira vez na versão 5.6:

O que há de errado com o PDO_ODBC do seu PHP enviado ?


Ao olhar para um desses patches 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 a única coisa que mudou foi SDWORD (inteiro com sinal de 16 bits) que é substituído pelo novo tipo ODBC SQLULEN que é 64 bits em um aplicativo ODBC de 64 bits e 32 bits em um aplicativo ODBC de 32 bits .

Acredito que o committer não estava ciente de colsize tipo de dados apenas, pois na próxima linha SQLLEN está definido corretamente.

O que devo fazer agora?

  1. Atualize para a versão do PHP>=5.6
  2. Fique com odbc_* funciona como uma solução de trabalho.
  3. Compile um PHP v5.5.9 com os patches fornecidos.
  4. Crie seu próprio wrapper PDO conforme recomendado por @GordonM