Se il nome di una persona è Null, come si spezzerebbe il database?


55

Stavo leggendo questo articolo sulla BBC. Racconta la storia di una persona di nome Jenifer Null e di come affronta problemi quotidiani usando database online come prenotazione di biglietti aerei, net banking ecc.

Non sono esperto di database e non lo uso molto spesso. Quando ho creato un sito Web per l'apprendimento, la convalida del modulo lato server utilizzava espressioni regolari. Da quello che ricordo, accetterebbe felicemente il nome "Null". Non l'ho provato però.

Qualcuno potrebbe spiegare i tecnicismi quando si verificherebbe questa situazione? La convalida del modulo sta facendo string == NULLqualcosa o qualcosa del genere? Anche così non penso NULL is same as "NULL".


32
L'articolo è stato ovviamente scritto da un giornalista. I nulli sono la causa di molte confusioni, non ti aspetteresti che un giornalista sia meno confuso.
ypercubeᵀᴹ

2
Tutti: i commenti con collegamenti a domande o articoli correlati sono stati spostati in una risposta Wiki della comunità di seguito. Modifica (o suggerisci una modifica) a quella risposta invece di aggiungere ulteriori collegamenti in questa pagina.
Paul White

Risposte:


42

Ho visto interfacce di database (ad esempio librerie di framework) che restituiscono "null" come stringa per colonne null. Credo che ci fosse una bandiera che lo avrebbe attivato o disattivato per il debug. Questo flag consente agli sviluppatori di determinare facilmente se il campo vuoto era il risultato di un valore nullo o di un valore vuoto. Questa è una cattiva impostazione, specialmente nella produzione, e spiegherebbe i problemi spiegati nell'articolo.

L'elaborazione inversa della conversione di "null" in un valore null dovrebbe generare un errore dell'applicazione per un campo nome. Mi aspetto che questo si risolva piuttosto rapidamente.


In effetti, questo è abbastanza comune nei framework per linguaggi non tipizzati in cui tutti i dati vengono convertiti in una stringa. Sono passati alcuni anni da quando ci ho lavorato, ma credo che le prime versioni di ColdFusion avessero questo problema, per esempio.
Jules il

25

C'è una buona probabilità che una buona parte della tua confusione derivi da quella del giornalista. L'articolo parla di problemi con l'utilizzo di interi sistemi applicativi, non solo di database. Completamente ragionevole in quanto si tratta di un pezzo di scrittura finalizzato al consumo di massa, ma i dettagli tecnici sono sovrastati o fraintesi dall'autore.

Probabilmente un certo numero di questi problemi è causato a livello dell'applicazione, piuttosto che nell'API del DB. I valori magici sono un anti-modello che è ridicolmente difficile da eliminare dal settore. Molto facilmente un programmatore avrebbe potuto scrivere una condizione sulla falsariga di "qualcuno ha digitato 'null'? Devono significare che non c'è valore, perché questo è ciò che significa null!" Un tentativo errato di prevenire l'iniezione di SQL potrebbe anche essere responsabile del maltrattamento menzionato di Null, o il cognome hawaiano che contiene una singola citazione, che è anche il delimitatore di stringa SQL standard.

Un'applicazione che trasforma erroneamente questi valori in NULL o in una stringa vuota può facilmente creare errori se la logica aziendale o i vincoli del DB prevedono qualcosa di diverso. Ciò si traduce naturalmente in un'esperienza utente frustrante descritta nell'articolo.


5
Non sapevo che O'Brian fosse hawaiano.
glglgl,

19

L'articolo stesso include un collegamento a una domanda Stack Overflow che dimostra il problema; era in un'applicazione Flex in cui il codice:

currentChild.appendChild("Fred");

aggiungerebbe un elemento contenente la parola Freda un documento XML ma il codice:

currentChild.appendChild("null");

aggiungerebbe un elemento vuoto, non un elemento contenente il testo "null".

XML, di per sé, non ha problemi con il valore di testo "NULL", quindi includere tale testo non sarebbe un problema. In effetti, NULLnon ha alcun significato speciale in XML.


13

Una cosa che non credo di aver visto menzionato: non stiamo parlando solo di SQL.

Il nome potrebbe iniziare / terminare nel database ... ma per arrivarci normalmente coinvolge canali MULTIPLI. Database, Sql, php, html, javascript ... Java, C #, VB, Perl, Phython, Ruby, bash, batch, ecc, ecc, ecc ...

Ognuno di questi passaggi nella pipeline potrebbe comportare la conversione di dati da un formato a un altro. Dalle tabelle Sql, a JSON, a XML, a CSV, ecc ...

In qualsiasi punto di questa complicata catena, ci vorrà solo un punto di programmazione errata o un linguaggio di programmazione sfocato ( ad esempio la gestione null di Javascript ) ...

Quindi non limitarti al problema che si trova nel database ... perché può trovarsi ovunque nello "stack".



4

I database relazionali devono contenere valori mancanti o non pertinenti. Ad esempio, l'elenco dei clienti può includere un numero di cellulare o un genere. E se un'azienda volesse diventare un cliente: quale genere dovrebbe avere?

Un indicatore speciale viene utilizzato per mostrare che manca un valore. Questa bandiera speciale è NULL. Quindi una programmazione sciatta può causare la confusione dell'indicatore del valore mancante - NULL - con il cognome di Jennifer Null, forse interpretando il suo cognome come dati mancanti piuttosto che come valore reale.

È un po 'come aprire un conto in banca ma non depositare denaro. Il saldo è zero. Questo non significa che non hai equilibrio. Significa che hai un saldo e il suo valore è "0". Ma la programmazione sciatta potrebbe interpretare erroneamente lo zero come un "non esiste" e determinare che non si dispone affatto di un account.


2

C'è un sacco di software scritto male, e persino framework, che si comporterebbe in modo strano con qualcuno di nome Null.

Ma non dimentichiamo l'elemento umano: forse gli umani vedono il nome su schermi e stampe e pensano che sia un errore e cancellare la persona è un'altra causa probabile?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.