Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Debug PDO mySql wstaw NULL do bazy danych zamiast pustego

Wydaje mi się, że jest to (niezgłoszony?) błąd w emulacji przygotowanej instrukcji PDO:

  1. implementacja z PDOStatement::execute() ewentualnie wywołuje pdo_parse_params() ;

  2. to z kolei próby cytowania/unikania wartości na podstawie typu danych odpowiedniego parametru (jak wskazuje $data_type argumenty do PDOStatement::bindValue() i PDOStatement::bindParam() —wszystkie parametry podane jako $input_parameters do PDOStatement::execute() są traktowane jako PDO::PARAM_STR , zgodnie z dokumentacją tej funkcji);

  3. wartości wpisane w ciąg znaków są cytowane/wymieniane przez wywołanie odpowiedni sterownik bazy danych quoter() metoda niezależnie od tego, czy są null :w przypadku PDO_MySQL jest to mysql_handle_quoter() , który (ostatecznie) przekazuje wartość do mysqlnd_cset_escape_quotes() lub mysql_cset_escape_slashes() , w zależności od NO_BACKSLASH_ESCAPES serwera tryb SQL;

  4. otrzymał null argument, obie te funkcje zwracają pusty ciąg.

Moim zdaniem przed włączeniem parametru wpisz (w kroku 2 powyżej), pdo_parse_params() powinien ustawić typ na PDO::PARAM_NULL jeśli wartość to null . Jednak niektórzy mogą twierdzić, że uniemożliwiłoby to obsługę specyficznego dla typu null wartości tam, gdzie to konieczne, w takim przypadku string case (w kroku 3 powyżej) zdecydowanie powinien obsługiwać null wartości przed kontynuowaniem wywołania funkcji quoter() sterownika metoda.

Jako tymczasowe obejście, wyłączenie emulacji przygotowanych instrukcji jest zazwyczaj najlepsze:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ClassNotFoundException:com.mysql.jdbc.GoogleDriver

  2. Multi_Curl z wartościami z kolumny mysql

  3. MySQL konwertuje dane wyjściowe w formacie timediff na dzień, godzinę, minutę i drugi format

  4. Wstawianie zbiorcze lub aktualizowanie za pomocą Hibernate?

  5. Unikalne ograniczenie, które pozwala na puste wartości w MySQL