Jeśli imię osoby to Null, to jak zniszczyłaby bazę danych?

55

Czytałem ten artykuł o BBC. Opowiada historię osoby o imieniu Jenifer Null i jej codziennych problemów podczas korzystania z internetowych baz danych, takich jak rezerwacja biletów lotniczych, bankowość internetowa itp.

Nie jestem dobrze zorientowany w bazach danych i nie używam go zbyt często. Kiedy utworzyłem stronę internetową do nauki, sprawdzanie poprawności formularza po stronie serwera używało wyrażeń regularnych. Z tego, co pamiętam, chętnie przyjąłbym nazwę „Null”. Jednak tego nie próbowałem.

Czy ktoś mógłby wyjaśnić szczegóły techniczne, kiedy taka sytuacja miałaby miejsce? Czy sprawdzanie poprawności formularza to po prostu robienie string == NULLczegoś? Mimo to nie sądzę NULL is same as "NULL".

Souradeep Nanda
źródło
32
Artykuł został oczywiście napisany przez dziennikarza. Wartości zerowe są przyczyną wielu nieporozumień, nie można oczekiwać, że dziennikarz będzie mniej zdezorientowany.
ypercubeᵀᴹ
2
Wszyscy: komentarze z linkami do powiązanych pytań lub artykułów zostały przeniesione do odpowiedzi na Wiki społeczności poniżej. Edytuj (lub zasugeruj edycję) tej odpowiedzi zamiast dodawać kolejne linki na tej stronie.
Paul White

Odpowiedzi:

42

Widziałem interfejsy baz danych (np. Biblioteki frameworków), które zwracają „null” jako ciąg znaków dla pustych kolumn. Uważam, że istniała flaga, która włącza lub wyłącza tę funkcję podczas debugowania. Ta flaga pozwala programistom łatwo ustalić, czy puste pole było wynikiem wartości pustej, czy pustej. Jest to złe ustawienie, szczególnie w produkcji, i wyjaśniałoby problemy wyjaśnione w artykule.

Odwrotne przetwarzanie konwersji wartości „null” na wartość null powinno wygenerować błąd aplikacji dla pola nazwy. Spodziewałbym się, że zostanie to dość szybko rozwiązane.

BillThor
źródło
Rzeczywiście - jest to dość powszechne w ramach dla nietypowych języków, w których wszystkie dane są konwertowane na ciąg. Minęło kilka lat, odkąd nad nim pracowałem, ale uważam, że na przykład wczesne wersje ColdFusion miały ten problem.
Jules
25

Istnieje duża szansa, że ​​spora część twojego zamieszania wynika z dziennikarstwa. Artykuł mówi o problemach związanych z używaniem całych systemów aplikacji, a nie tylko baz danych. Całkowicie uzasadnione, ponieważ jest to pismo mające na celu masową konsumpcję, ale szczegóły techniczne są pomijane lub źle rozumiane przez autora.

Prawdopodobnie wiele z tych problemów jest spowodowanych w warstwie aplikacji, a nie w interfejsie API bazy danych. Wartości magiczne to anty-wzór, który jest absurdalnie trudny do usunięcia z branży. Bardzo łatwo jakiś programista mógł napisać warunek w stylu „ktoś napisał„ null ”? Muszą oznaczać, że nie ma żadnej wartości, ponieważ to właśnie oznacza null!” Nieudana próba uniemożliwienia wstrzykiwania SQL może być również odpowiedzialna za wspomniane złe traktowanie wartości Null lub hawajskie nazwisko zawierające pojedynczy cudzysłów, który jest również standardowym ogranicznikiem łańcucha SQL.

Aplikacja, która niepoprawnie przekształca te wartości na NULL lub pusty ciąg, może łatwo tworzyć błędy, jeśli logika biznesowa lub ograniczenia DB oczekują czegoś innego. To oczywiście powoduje frustrujące wrażenia użytkownika opisane w tym artykule.

Nazwa ezoteryczna
źródło
5
Nie wiedziałem, że O'Brian był hawajczykiem.
glglgl 21.04.16
19

Sam artykuł zawiera link do pytania o przepełnienie stosu, które pokazuje problem; było w aplikacji Flex, gdzie kod:

currentChild.appendChild("Fred");

dodałby element zawierający słowo Freddo dokumentu XML, ale kod:

currentChild.appendChild("null");

dodawałby pusty element, a nie element zawierający tekst „null”.

XML jako taki nie ma problemu z wartością tekstową „NULL”, więc włączenie takiego tekstu nie byłoby problemem. W rzeczywistości NULLnie ma żadnego specjalnego znaczenia w XML.

Dour High Arch
źródło
13

Jednej rzeczy, o której chyba nie wspominałem: nie mówimy tylko o SQL.

Nazwa może zaczynać / kończyć się w bazie danych ... ale aby się tam dostać normalnie wymaga WIELU kanałów. Baza danych, Sql, php, html, javascript ... Java, C #, VB, Perl, Phython, Ruby, bash, partia itp. Itd.

Każdy z tych kroków w potoku może obejmować konwersję danych z jednego formatu na inny. Od tabel SQL do JSON, XML, CSV itp.

W dowolnym momencie tego skomplikowanego łańcucha zajmie tylko jedno miejsce złego programowania lub niewyraźny język programowania ( na przykład obsługa zerowego Javascript ) ...

Więc nie ograniczaj się do problemu znajdującego się w bazie danych ... ponieważ może znajdować się w dowolnym miejscu na „stosie”.

WernerCD
źródło
4

Relacyjne bazy danych muszą uwzględniać brakujące lub nieistotne wartości. Na przykład lista klientów może zawierać numer telefonu komórkowego lub płeć. Co jeśli korporacja chce zostać klientem - jaką płeć powinna mieć?

Specjalny wskaźnik służy do wskazania braku wartości. Ta specjalna flaga ma wartość NULL. Tak więc niechlujne programowanie może powodować pomylenie wskaźnika brakującej wartości - NULL - z nazwiskiem Jennifer Null, być może interpretując jej nazwisko jako brakujące dane, a nie wartość rzeczywistą.

To trochę jak otwieranie konta bankowego, ale nie wpłacanie żadnych pieniędzy. Saldo wynosi zero. To nie znaczy, że nie masz równowagi. Oznacza to, że masz saldo, a jego wartość wynosi „0”. Ale niechlujne programowanie może błędnie interpretować zero, ponieważ „nie istnieje” i stwierdzić, że w ogóle nie masz konta.

Michael Green
źródło
2

Istnieje mnóstwo źle napisanego oprogramowania, a nawet frameworków, które działałyby dziwnie z kimś o imieniu Null.

Ale nie zapominajmy o ludzkim żywiole: może ludzie widzą to imię na ekranach i wydrukach i myślą, że to pomyłka, a usunięcie osoby to kolejna prawdopodobna przyczyna?

MGOwen
źródło