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

デバッグPDOmySqlは、空ではなくNULLをデータベースに挿入します

    これは、PDOのプリペアドステートメントエミュレーションの(報告されていない?)バグのように見えます:

    1. 実装 PDOStatement ::execute()最終的に pdo_parse_params()を呼び出します ;

    2. 次に、値の引用/エスケープを試みます 関連するパラメータのデータ型に基づきます( $ data_type で示されます)。 PDOStatement ::bindValue()への引数 および PDOStatement ::bindParam() -すべてのパラメーターは$input_parametersとして提供されます PDOStatement ::execute() PDO ::PARAM_STRとして扱われます 、その関数のドキュメントに記載されているように);

    3. 文字列型の値は、呼び出し<を呼び出すことにより、エスケープ/引用されます。 / a> 関連するデータベースドライバーの quote() nullであるかどうかに関係なくメソッド :PDO_MySQLの場合、それは mysql_handle_quoter() 、(最終的に)値を<のいずれかに渡します。 code> mysqlnd_cset_escape_quotes() または mysql_cset_escape_slashes() 、サーバーの NO_BACKSLASH_ESCAPESによって異なります SQLモード;

    4. 与えられたnull 引数の場合、これらの関数は両方とも空の文字列を返します。

    私の意見では、パラメータをオンにする前に、タイプ (上記のステップ2で)、 pdo_parse_params() タイプをPDO::PARAM_NULLに設定する必要があります 値がnullの場合 。ただし、これにより nullのタイプ固有の処理が妨げられると主張する人もいるかもしれません。 必要に応じて値。この場合、 string case (上記のステップ3で)間違いなく nullを処理する必要があります ドライバーのquoter()の呼び出しに進む前の値 メソッド。

    暫定的な回避策として、プリペアドステートメントのエミュレーションを無効にするのが通常は最善の方法です:

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    



    1. Laravel 5 Eloquent:実行されている生のSQLを取得する方法は? (バインドされたデータを使用)

    2. CSV形式のPostgresCOPYコマンドで見積もり処理をオフにすることは可能ですか?

    3. Webから実行するとクエリはタイムアウトしますが、SSMSから実行すると超高速になります

    4. PostgreSQLでデータベースのサイズを取得する2つの方法