Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

'PDOException' dengan pesan 'SQLSTATE[22001]:Data string, terpotong kanan:0

Sayangnya,

Ini adalah PDO_ODBC Masalah ketidakcocokan 64-bit (#61777 , #64824 ) dan tanpa ragu Anda menggunakan versi 64-bit yang tidak memungkinkan Anda untuk mengikat parameter.

Untungnya,

Ada patch yang pertama kali disertakan dalam rilis 5.6:

Apa yang salah dengan PDO_ODBC PHP Anda yang dikirimkan ?

Dengan melihat salah satu patch yang direkomendasikan:

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;

Kami melihat satu-satunya hal yang berubah adalah SDWORD (Integer bertanda 16-bit) yang diganti dengan tipe ODBC baru SQLULEN yaitu 64 bit dalam aplikasi ODBC 64-bit dan 32 bit dalam aplikasi ODBC 32-bit .

Saya yakin committer tidak mengetahui colsize tipe data hanya karena di baris berikutnya SQLLEN didefinisikan dengan benar.

Apa yang harus saya lakukan sekarang?

  1. Tingkatkan ke versi PHP>=5.6
  2. Tetap menggunakan odbc_* berfungsi sebagai solusi yang berfungsi.
  3. Mengkompilasi PHP v5.5.9 dengan patch yang disediakan.
  4. Buat pembungkus PDO Anda sendiri seperti yang direkomendasikan oleh @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. Cara terbaik untuk menyimpan waktu (jj:mm) dalam database

  2. Jumlah Kumulatif SQL Server berdasarkan Grup

  3. SQL Server:Apakah mungkin untuk memasukkan ke dalam dua tabel secara bersamaan?

  4. Ekspresi reguler di dalam SQL Server

  5. Perbedaan Antara Tabel Sementara Lokal dan Global di SQL Server