Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Czy w bazach MySQL typy liczbowe INT nie mogą przyjmować wartości NULL?
hibernatus
post 7.04.2014, 16:12:50
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował hibernatus 7.04.2014, 21:04:01
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Pyton_000
post 7.04.2014, 16:56:48
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


musisz wstawić null lub nie określać tej kolumny przy insert (brak w deklaracji wrzucanych kolumn)
Go to the top of the page
+Quote Post
hibernatus
post 7.04.2014, 17:35:59
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował hibernatus 7.04.2014, 17:38:56
Go to the top of the page
+Quote Post
Pyton_000
post 7.04.2014, 17:41:02
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


nikt nie każe Ci wpisywać w formularzu null sciana.gif
Po stronie kodu nie walidujesz ? Błąd.
Go to the top of the page
+Quote Post
hibernatus
post 7.04.2014, 18:12:17
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Turson
post 7.04.2014, 19:04:30
Post #6





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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ć)
Go to the top of the page
+Quote Post
hibernatus
post 7.04.2014, 19:19:02
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował hibernatus 7.04.2014, 19:20:08
Go to the top of the page
+Quote Post
mmmmmmm
post 7.04.2014, 19:19:44
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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 ...

Ten post edytował mmmmmmm 7.04.2014, 19:20:05
Go to the top of the page
+Quote Post
hibernatus
post 7.04.2014, 19:34:20
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 7.04.2014, 19:38:50
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Pokaż fragment kodu wraz z pobieraniem zmiennych z $_POST, który wstawia dane.


--------------------
Go to the top of the page
+Quote Post
hibernatus
post 7.04.2014, 21:08:44
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


// 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.

Ten post edytował hibernatus 7.04.2014, 21:09:19
Go to the top of the page
+Quote Post
trueblue
post 7.04.2014, 21:09:15
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


$query.="kolumna1='$zmienna1', ";
Opatrzone ciapkami automatycznie castuje string 'null' albo '' do 0.
Bo to nie null, a string.

Ten post edytował trueblue 7.04.2014, 21:10:45


--------------------
Go to the top of the page
+Quote Post
hibernatus
post 7.04.2014, 23:39:46
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.04.2014

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Pyton_000
post 8.04.2014, 07:32:19
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


ehh... Pusta <> nieokreślona
'' <> null

  1. INSERT INTO xxx (id, type) VALUES (1, NULL);
Go to the top of the page
+Quote Post
markonix
post 8.04.2014, 10:58:03
Post #15





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 03:23