У меня возникли проблемы с привязкой нулевого параметра в следующем коде
$nullVariable = NULL; $sql = new PDO('mysql:host=' . $Server, $User, $Password); $sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column = :uuid"); $statement->bindParam(":uuid", $nullVariable, PDO::PARAM_NULL); $statement->execute(); $results = $statement->fetchAll(PDO::FETCH_ASSOC);
Переменная результатов будет пустым массивом. Если я не буду использовать параметры и изменить свой запрос на «WHERE Binary16Column IS NULL», он возвращает ожидаемое количество строк. Поэтому проблема заключается в том, как я обрабатываю этот параметр, а не мой SQL-запрос.
Мой код более сложный, чем приведенный выше, и мне нужно иметь возможность использовать переменную параметра, которая может быть нулевой, поэтому проверка наличия нулевой переменной и выполнение другого запроса менее чем идеальны. Технически у меня есть моя собственная функция для установки параметров, вот где я проверяю, является ли содержимое переменной нулевым, и привязывая этот параметр соответствующим образом, поэтому мне не нужно писать ненужное количество запросов. Запрос работает также отлично, если переменная содержит достоверные данные, а тип параметра – PARAM_LOB.
Кто-нибудь знает, что я делаю неправильно? Большое спасибо!
Читайте о трехзначной логике . NULL не является значением; это маркер отсутствия значения, и поэтому NULL никогда не может быть равным ничему, включая себя.
Тем не менее, существует нулевой безопасный оператор сравнения, также известный как «оператор космического корабля», который считает два нули эквивалентными.
WHERE Binary16Column <=> :uuid
… должен делать то, что вы ожидали.
Если вы хотите выбрать запись с Binary16Column
это Binary16Column
равно null, вам нужно использовать IS NULL
в качестве условия, но не = NULL
.
SELECT * FROM Table WHERE Binary16Column IS NULL
Вам нужно сделать:
$uuid = /**some value**/; $sql = new PDO('mysql:host=' . $Server, $User, $Password); $sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); if ($uuid === null) { $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column IS NULL"); } else { $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column = :uuid"); $statement->bindParam(":uuid", $uuid); } $statement->execute(); $results = $statement->fetchAll(PDO::FETCH_ASSOC);
Я думаю, причина, по которой вы не получаете результат, потому что NULL – это ключевое слово. Из-за того, как MySQL обрабатывает значения NULL, я думаю, вам нужно будет сделать NULL, когда вы выполняете поиск значений NULL. Я провел кучу тестов в своей локальной базе данных, где у меня есть значения NULL. Единственный раз, когда он работал, когда я использовал IS NULL или IS NOT NULL.
Мне жаль, что я не могу больше помочь (или если я просто расскажу вам то, что вы уже знаете), но похоже, что вам придется писать отдельные запросы или, возможно, простую логику, чтобы объединить соответствующую логику WHERE , в зависимости от того, является ли переменная нулевой или нет.