Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

'PDOException' z komunikatem 'SQLSTATE[22001]:Ciąg danych, obcięty do prawej:0

Niestety

To PDO_ODBC 64-bitowy problem z niezgodnością (#61777 , #64824 ) i bez żadnych wątpliwości korzystasz z wersji 64-bitowej, która nie pozwala na wiązanie parametrów.

Na szczęście

Ma łatkę który został po raz pierwszy zawarty w wydaniu 5.6:

Co jest nie tak z dostarczonym PDO_ODBC PHP? ?

Patrząc na jedną z tych zalecanych poprawek:

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;

Widzimy, że jedyną zmianą jest SDWORD (16-bitowa liczba całkowita ze znakiem), która została zastąpiona nowym typem ODBC SQLULEN czyli 64 bity w 64-bitowej aplikacji ODBC i 32 bity w 32-bitowej aplikacji ODBC .

Wydaje mi się, że zgłaszający nie był świadomy colsize typ danych tylko dlatego, że w następnej linii SQLLEN jest prawidłowo zdefiniowany.

Co mam teraz zrobić?

  1. Uaktualnij do wersji PHP>=5.6
  2. Trzymaj się odbc_* działa jako działające rozwiązanie.
  3. Skompiluj PHP w wersji 5.5.9 z dostarczonymi łatami.
  4. Zbuduj własne opakowanie PDO zgodnie z zaleceniami @GordonM


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak opróżnić bufor PRINT w TSQL?

  2. Używanie merge..output do uzyskania mapowania między source.id i target.id

  3. Podział ciągu T-SQL

  4. Znajdź wszystkie tabele zawierające kolumnę o określonej nazwie - MS SQL Server

  5. Agreguj LUB bitowe w podzapytaniu