sql >> Databáze >  >> RDS >> Sqlserver

'PDOException' se zprávou 'SQLSTATE[22001]:Data řetězce, vpravo zkrácena:0

Bohužel

Je to PDO_ODBC Problém s 64bitovou nekompatibilitou (#61777 , #64824 ) a bez jakýchkoliv pochybností jste na 64bitovém sestavení, které vám neumožňuje svázat parametry.

Naštěstí

Má záplatu který byl poprvé zahrnut ve verzi 5.6:

Co je špatného na dodaném PHP PDO_ODBC ?

Když se podíváte na jednu z těchto doporučených oprav:

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;

Vidíme, že jediná věc, která se změnila, je SDWORD (16bitové celé číslo se znaménkem), které je nahrazeno novým typem ODBC SQLULEN to je 64 bitů v 64bitové aplikaci ODBC a 32 bitů v 32bitové aplikaci ODBC .

Domnívám se, že komisař si nebyl vědom colsize pouze datový typ, protože hned na dalším řádku je SQLLEN je správně definováno.

Co mám teď dělat?

  1. Upgradujte na verzi PHP>=5.6
  2. Zůstaňte u odbc_* funguje jako funkční řešení.
  3. Zkompilujte PHP v5.5.9 s poskytnutými záplatami.
  4. Vytvořte si vlastní obal PDO podle doporučení @GordonM


  1. mysql dotaz - formát data na výstupu?

  2. Počítání počtu provedených dotazů

  3. Resetujte hodnotu sekvence na 1

  4. Chyba příkazu Postgresql COPY poskytující oprávnění byla odepřena