sql >> データベース >  >> RDS >> Sqlserver

'PDOException'とメッセージ'SQLSTATE[22001]:文字列データ、右切り捨て:0

    残念ながら

    PDO_ODBCです 64ビットの非互換性の問題(#61777 #64824 )そして間違いなく、パラメータをバインドできない64ビットビルドを使用しています。

    幸いなことに

    パッチがあります これは5.6リリースに最初に含まれていました:

    PHPに付属のPDO_ODBCの何が問題になっていますか ?

    それらの推奨パッチの1つを見て:

    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;
    

    変更されたのはSDWORDだけです。 (16ビット符号付き整数)新しいODBCタイプSQLULENに置き換えられます つまり、 64ビットODBCアプリケーションでは64ビット、32ビットODBCアプリケーションでは32ビットです。

    コミッターはcolsizeを認識していなかったと思います 次の行にあるSQLLEN以降のデータ型のみ 正しく定義されています。

    今何をすればいいですか?

    1. PHPバージョンへのアップグレード>=5.6
    2. odbc_*に固執する 実用的なソリューションとして機能します。
    3. 提供されているパッチを使用してPHPv5.5.9をコンパイルします。
    4. @GordonMの推奨に従って、独自のPDOラッパーを作成します


    1. ユーザーのパスワードとソルトをMySQLに安全に保存するにはどうすればよいですか?

    2. SqlParameterの名前/値コンストラクターが0をnullとして扱うのはなぜですか?

    3. Doctrine2とMySQLでストアドプロシージャを実行する方法

    4. 変数を使用しているときにクエリでGROUPBYを使用する方法