MySQL NULL == (decimal) 0.00

komputerek_phpDziś MySQL zapewnił mi dość ciekawe doświadczenie. Spotkałem się z dziwną właściwością tej bazy danych. Jedna z tabel jaką wykorzystuję w pracy ma zdefiniowane pole WYNIK jako: decimal(3,2) a domyślna komputerek_mysqlwartość tego pola to NULL. Tabela ta jest wykorzystywana jako miejsc w którym trzymane są wyniki testów punktowanych lub zapisywany jest bieżący stan odpowiedzi.

W zależności od zawartości pola WYNIK test traktowany jest jako zapisany (wartość NULL) lub wysłany (wartość liczbowa decimal z uzyskanym wynikiem). W ostatnim czasie spotkałem się z dziwnym zachowaniem tego mechanizmu testów punktowanych. Korzystając z formularza otwartego w kilku oknach, można było nadpisać pierwotnie wysłane dane z odpowiedziami testu. Błąd ten wynikał z faktu, że mechanizm nie rozpoznawał w prawidłowy sposób statusu wysłanego testu. Było to o tyle dziwne, że patrząc od strony rekordów znajdujących się w bazie danych wyglądało to całkowicie prawidłowo.

Za brak prawidłowego rozpoznania odpowiedzialny był MySQL, dla którego wartość pola WYNIK = NULL jest równoważne z wartością pola WYNIK = 0.00.

W celu sprawdzenia statusu danego testu wykonywane było sprawdzenie liczby rekordów zwracanych przez poniższe zapytanie:
SELECT *FROM `test`
WHERE `id_uzytkownika` =1
AND `punkty` != NULL

w obu przypadkach zwróci ten sam wynik, czyli 0 rekordów.

Sposób na szybkie sprawdzenie rzeczywistego statusu testu to pobranie rekordu danego użytkownika a następnie sprawdzenie wartości pola już po stronie PHP. Można to zrealizować choćby w ten sposób:

$test_wyslany=0;
if (!empty($test['WYNIK'])) {
$test_wyslany=1;
}

$test – tablica z wynikiem powyższego zapytania SQL

Ot taka ciekawostka ze styku programowania i właściwości baz danych.
ddd

Znaczniki: , , ,

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


− 2 = trzy

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>