![]() |
![]() |
![]()
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 |
|
|
![]() |
![]()
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)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 7.04.2014 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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
![]() Po stronie kodu nie walidujesz ? Błąd. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 7.04.2014 Ostrzeżenie: (0%) ![]() ![]() |
nikt nie każe Ci wpisywać w formularzu null ![]() 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 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? |
|
|
![]()
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ć) |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 7.04.2014 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ć) 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 |
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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.
-------------------- |
|
|
![]()
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 |
|
|
![]()
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 -------------------- |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 7.04.2014 Ostrzeżenie: (0%) ![]() ![]() |
$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? |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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:
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. -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 03:23 |