Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

'PDOException' avec le message 'SQLSTATE[22001] :Données de chaîne, tronquées à droite :0

Malheureusement,

C'est un PDO_ODBC Problème d'incompatibilité 64 bits (#61777 , #64824 ) et sans aucun doute vous êtes sur une version 64 bits qui ne vous permet pas de lier les paramètres.

Heureusement,

Il a un correctif qui a été inclus pour la première fois dans la version 5.6 :

Quel est le problème avec le PDO_ODBC expédié de votre PHP ? ?

En consultant l'un de ces correctifs recommandés :

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;

Nous voyons que la seule chose qui a changé est SDWORD (entier signé 16 bits) qui est remplacé par le nouveau type ODBC SQLULEN c'est-à-dire 64 bits dans une application ODBC 64 bits et 32 ​​bits dans une application ODBC 32 bits .

Je crois que le committer n'était pas au courant de colsize type de données uniquement puisque dans la toute prochaine ligne SQLLEN est défini correctement.

Que dois-je faire maintenant ?

  1. Passer à la version PHP>=5.6
  2. Reste avec odbc_* fonctionne comme une solution de travail.
  3. Compilez un PHP v5.5.9 avec les correctifs fournis.
  4. Construisez votre propre wrapper PDO comme recommandé par @GordonM