Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy w bazach MySQL typy liczbowe INT nie mogą przyjmować wartości NULL?
Forum PHP.pl > Forum > Bazy danych > MySQL
hibernatus
Czy w bazach MySQL typy liczbowe INT (oraz DECIMAL) nie mogą przyjmować wartości NULL?

Nie chodzi tu o definiowane kolumn w tabeli przy zakładaniu bazy, tylko o zapisywanie wartości z formularza do bazy.

Opis problemu:
Wprowadzam dane do formularza, w określone pole nie wprowadzam żadnej wartości, przekazywana zmienna $_POST['okreslonepole'] jest pusta. Natomiast po zapisie danych w odpowiedniej kolumnie bazy danych zamiast NULL znajduje się 0. Czyli brak danych jest zamieniany na 0. Kolumna ta nie ma atrybutu NOT NULL i poziomu phpMyAdmin można jej przypisać wartość NULL.

Dla mnie, w tym przypadku, to poważny problem, ponieważ 0 to określona wartość, a ja potrzebuję mieć możliwość zapisania stanów:
- brak wartości (czyli NULL),
- jakaś wartość liczbowa (w tym wartość 0).

EDYCJA: sedno problemu
Następujące polecenie SQL:
INSERT INTO nazwatabeli SET kolumna='';
wstawia do wskazanej kolumny tabeli wartość 0 zamiast wartości pustej NULL, w kontekście tego mam pytanie:
Czy w bazach MySQL typy liczbowe INT (oraz DECIMAL), wprowadzane za pomocą INSERT, nie mogą przyjmować wartości NULL?
Dziwnie to działa, przecież 0 to taka sama wartość liczbowa, jak każda inna, a SQL powinno zamieniać wartość niezdefiniowaną na NULL.
Pyton_000
musisz wstawić null lub nie określać tej kolumny przy insert (brak w deklaracji wrzucanych kolumn)
hibernatus
Cytat(Pyton_000 @ 7.04.2014, 17:56:48 ) *
musisz wstawić null lub nie określać tej kolumny przy insert (brak w deklaracji wrzucanych kolumn)


Czyli domyślnie brak wartości jest zamieniany na 0 i nic się nie da z tym zrobić?

Z wstawianiem null, czyli jak rozumiem wpisywaniem null w dane pole formularza jest pewien problem. Formularz zbiera naprawdę dużą liczbę danych numerycznych, które podlegają walidacji po stronie przeglądarki (jQuery) - tj dopuszczalne są tylko wartości liczbowe z określonego przedziału. By można było wpisać null musiałbym dopuścić wpisywanie znaków tekstowych i tym samym zwiększam ryzyko popełnienie pomyłek przy wprowadzaniu danych.

To zresztą jest mniejszy problem - większy polega na tym, że sporo sposród dużej ilości pól może akurat nie mieć przypisanej żadnej wartości - gdyby brak wartości nie był zamieniany na 0, to znacznie ułatwiałoby wprowadzanie danych ograniczając liczbę wymaganych wpisów tylko do pól posiadających zdefiniowane wartości. W przypadku wymogu wpisywania NULL czas potrzebny na wprowadzanie danych znacznie wzrasta.

Może rozwiązaniem byłoby wpisane null, jako wartości domyslnej w formularzu - dzięki za sugestię o wstawianiu null - sprawdzę, czy to zadziała prawidłowo.

Pominięcie kolumny przy INSERT zupełnie odpada, bo pola niezdefiniowane mogą być za każdym razem inne.
Pyton_000
nikt nie każe Ci wpisywać w formularzu null sciana.gif
Po stronie kodu nie walidujesz ? Błąd.
hibernatus
Cytat(Pyton_000 @ 7.04.2014, 18:41:02 ) *
nikt nie każe Ci wpisywać w formularzu null sciana.gif

A gdzie mam to wpisywać? Prościej byłoby wpisać to jako wartość domyślną, niż sprawdzać kilkaset zmiennych po stronie serwera.
Jednak niezależnie od metody jest to bezprzedmiotowe - patrz niżej

Cytat(Pyton_000 @ 7.04.2014, 17:56:48 ) *
musisz wstawić null

Wstawiłem NULL bezpośrednio w samym poleceniu INSERT i niestety w bazie pojawiło się 0, zamiast NULL.
Jak mam zatem wpisać NULL do danej kolumny w bazie?
Turson
Skoro masz kolumnę int to jak ma wpisać null?
Nie musisz pisać null przy wstawianiu, możesz po prostu pominąć kolumnę (tzn. nic do niej nie wpisywać)
hibernatus
Cytat(Turson @ 7.04.2014, 20:04:30 ) *
Skoro masz kolumnę int to jak ma wpisać null?
Nie musisz pisać null przy wstawianiu, możesz po prostu pominąć kolumnę (tzn. nic do niej nie wpisywać)


Formularz zbiera ponad 200 parametrów. Pominięcie kolumny przy INSERT zupełnie odpada, bo pola niewypełnione/niezdefiniowane mogą być za każdym razem inne. Rozumiem, że jest tak, jak w zadanym w temacie wątku pytaniu - wartość nieokreślona z formularza (puste pole) zostanie zawsze zamieniona na 0? Swoją drogą dziwnie to działa, przecież 0 to taka sama wartość jak każda inna, powinno zamieniać wartość niezdefiniowaną na NULL.
mmmmmmm
Cytat
Wstawiłem NULL bezpośrednio w samym poleceniu INSERT i niestety w bazie pojawiło się 0, zamiast NULL.
Jak mam zatem wpisać NULL do danej kolumny w bazie?

Pokaż DDL tabeli. Po MySQL-owemu to będzie: SHOW CREATE TABLE ...
hibernatus
CREATE TABLE nazwatabeli (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
parametr1 INT,
parametr2 INT,
...
parametrN INT,
);

Niektóre parametry są TINYINT, niektóre DECIMAL. Żaden z parametrów, poza głównym kluczem, nie ma atrybutu NOT NULL.
trueblue
Pokaż fragment kodu wraz z pobieraniem zmiennych z $_POST, który wstawia dane.
hibernatus
// odczytanie danych z tablicy S_POST
$zmienna1=$_POST['zmienna1'];
$zmienna2=$_POST['zmienna2'];
...
$zmiennaN=$_POST['zmiennaN'];

// budowanie zmiennej zapytania $query
$query="INSERT INTO nazwatabeli SET ";
$query.="id_operacji=NULL, ";
$query.="kolumna1='$zmienna1', ";
$query.="kolumna2='$zmienna2', ";
...
$query.="kolumnaN='$zmiennaN'";

// zapytanie INSERT
$db_result=@mysql_query($query);

Dla uproszczenia, by nie doszukiwać się błędów na wcześniejszych etapach przetwarzania wprowadzanych danych - sedno problemu:

Następujące polecenie SQL:
INSERT INTO nazwatabeli SET kolumna='';
wstawia do wskazanej kolumny tabeli wartość 0 zamiast wartości pustej/nieokreślonej NULL). W kontekście tego mam pytanie:
Czy w bazach MySQL typy liczbowe INT (oraz DECIMAL), wprowadzane za pomocą INSERT, nie mogą przyjmować wartości NULL?

Dziwnie to działa, przecież 0 to taka sama wartość liczbowa, jak każda inna, a SQL powinno zamieniać wartość niezdefiniowaną na NULL.
trueblue
$query.="kolumna1='$zmienna1', ";
Opatrzone ciapkami automatycznie castuje string 'null' albo '' do 0.
Bo to nie null, a string.
hibernatus
Cytat(trueblue @ 7.04.2014, 22:09:15 ) *
$query.="kolumna1='$zmienna1', ";
Opatrzone ciapkami automatycznie castuje string 'null' albo '' do 0.
Bo to nie null, a string.


OK, jednak nawet jeśli jakoś zbudowałbym (?) zmienną zapytania/zapytanie bez zastosowania znaku " to i tak samo czyste polecenie SQL:
INSERT INTO nazwatabeli SET kolumna='';
przerobi mi wartość pustą/nieokreśloną na 0.

Czyli nie da się zapisać za pomocą polecenia INSERT wartości pustej/nieokreślonej do bazy danych MySQL?
Pyton_000
ehh... Pusta <> nieokreślona
'' <> null

  1. INSERT INTO xxx (id, type) VALUES (1, NULL);
markonix
Jeżeli budujesz dynamicznie zapytanie zrób tak:

  1. if (!empty($zmienna2))
  2. $query.="kolumna2='$zmienna2',


Ogólnie skoro wszystkie zmienne mają liczbę na końcu to zrobiłbym to pętlą, najlepiej na tablicy i złączyć przecinkami za pomocą implode.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.