sql >> Database >  >> RDS >> Sqlserver

'PDOException' met bericht 'SQLSTATE[22001]:String data, rechts afgekapt:0

Helaas,

Het is een PDO_ODBC 64-bits incompatibiliteitsprobleem (#61777 , #64824 ) en je hebt zonder enige twijfel een 64-bits build waarmee je geen parameters kunt binden.

Gelukkig,

Er zit een patch op die voor het eerst was opgenomen in de 5.6-release:

Wat is er mis met de door uw PHP verzonden PDO_ODBC ?

Door naar een van die aanbevolen patches te kijken:

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;

We zien dat het enige dat is veranderd, is SDWORD (16-bits geheel getal met teken) dat wordt vervangen door het nieuwe ODBC-type SQLULEN dat is 64 bits in een 64-bits ODBC-toepassing en 32 bits in een 32-bits ODBC-toepassing .

Ik geloof dat committer niet op de hoogte was van colsize gegevenstype alleen sinds in de volgende regel SQLLEN correct is gedefinieerd.

Wat moet ik nu doen?

  1. Upgrade naar PHP-versie>=5.6
  2. Blijf bij odbc_* functioneert als een werkende oplossing.
  3. Compileer een PHP v5.5.9 met meegeleverde patches.
  4. Bouw je eigen PDO-wrapper zoals aanbevolen door @GordonM


  1. Overzicht van gegevenscompressie in SQL Server

  2. Een veilig inlogscript maken in PHP en MySQL zonder HTTPS

  3. MySQL Integer versus DateTime-index

  4. ongeldige bytereeks voor codering van UTF8