Dovrei usare NULL o una stringa vuota per rappresentare nessun dato nella colonna della tabella?

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

Domanda

Stringa nulla o vuota: è meglio l'una dell'altra per non rappresentare dati in una colonna della tabella? (Uso specificamente MySQL, ma sto pensando che questo sia indipendente dal sistema.) Ci sono grandi vantaggi / svantaggi nell'usare l'uno rispetto all'altro, o è semplicemente la preferenza del programmatore?

È stato utile?

Soluzione

Non sono assolutamente d'accordo con tutti coloro che affermano di utilizzare incondizionatamente NULL. Consentire a una colonna di essere NULL introduce uno stato aggiuntivo che non si avrebbe se si imposta la colonna su NOT NULL. Non farlo se non è necessario lo stato aggiuntivo. Cioè, se non riesci a trovare una differenza tra il significato di stringa vuota e il significato di null, imposta la colonna come NOT NULL e usa la stringa vuota per rappresentare vuota. Rappresentare la stessa cosa in due modi diversi è una cattiva idea.

La maggior parte delle persone che ti hanno detto di usare NULL hanno anche fornito un esempio in cui NULL significherebbe qualcosa di diverso dalla stringa vuota. E in quegli esempi, hanno ragione.

Il più delle volte, tuttavia, NULL è uno stato extra inutile che obbliga i programmatori a gestire più casi. Come altri hanno già detto, Oracle non consente a questo stato extra di esistere perché considera la stringa NULL e vuota come la stessa cosa (è impossibile memorizzare una stringa vuota in una colonna che non consente null in Oracle).

Altri suggerimenti

Null. Una stringa vuota non è " nessun dato " ;, sono dati che sembrano vuoti.

Null è meglio " " rappresenta effettivamente i dati e non registrerà lo stesso nel tuo codice

Nel contesto del modello di database relazionale, null indica "nessun valore" o "valore sconosciuto". Esiste esattamente per lo scopo che descrivi.

AGGIORNAMENTO: Scusa, ho dimenticato di aggiungere che mentre la maggior parte (tutti?) RDMBS utilizza questa stessa definizione per null, ci sono differenze sfumate nel modo in cui viene gestito null. Ad esempio, MySQL e Oracle consentono più null in una colonna UNIQUE (o insieme di colonne), poiché null non è un valore e non può essere considerato univoco (null! = Null). Ma l'ultima volta che ho usato MS SQL Server, ha consentito solo un singolo null. Quindi potresti dover considerare il comportamento RDBMS e se la colonna in questione sarà vincolata o indicizzata.

Nessuno dei due. Rappresenta l'assenza di dati come assenza di tuple in una relazione.

Per motivi di prestazioni potresti voler evitare i join in alcuni RDBMS 'ma prova a progettare il modello in modo che le informazioni che possono mancare siano in una relazione separata.

Ecco un paio di collegamenti dal sito MySQL:

http://dev.mysql.com /doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com /doc/refman/5.0/en/working-with-null.html

Ho letto una volta che un valore NULL è 2 bit, mentre come stringa vuota è solo 1 bit. Il 99% delle volte questo non farà alcuna differenza, ma in una tabella molto grande quando non importa se NULL o '' , potrebbe essere migliore utilizzare '' se questo è vero.

Usa sempre NULL. Considera la differenza tra " Non so quale sia il numero di telefono di questa persona " (NULL) e " questa persona l'ha lasciato vuoto " (Vuoto).

Utilizza lo strumento giusto per il lavoro. NULL può indicare che nessun valore è stato fornito (ancora) oppure può indicare che nessun valore è applicabile.

Ma anche una stringa vuota è informazione. Può significare che un valore è applicabile ed è stato dato, ma sembra essere una stringa vuota.

Consentire a una colonna di contenere sia NULL che '' ti dà la possibilità di distinguere tra questi casi. In ogni caso, non è bene usarne uno per indicare l'altro.

Ricorda che nella concatenazione di stringhe, qualsiasi cosa combinata con NULL produce NULL. Ad esempio: CONCAT (NULL, 'foo') restituisce NULL. Impara a utilizzare la funzione COALESCE () se desideri convertire NULL in un valore predefinito in un'espressione SQL.

Il più delle volte null è migliore. Probabilmente ci sono alcune situazioni in cui fa poca differenza, ma sono poche. Ricorda solo quando chiedi che field = '' non è lo stesso di field is null (almeno in MySQL).

Per quanto ne so, Oracle non fa differenza.

select 1 from (select '' as col  from dual) where col is null;

Considera perché non ci sono dati nella colonna. Significa che il design del tavolo è sciatto? Nonostante non piacciano i null, ci sono occasioni in cui sono appropriati (o, abbastanza appropriati), e il sistema di solito non muore. Non consentire mai null in qualsiasi cosa che sia una chiave candidata (chiave primaria o alternativa).

Crea una tabella separata solo per la colonna nullable e una chiave esterna per la tabella principale. Se un record non ha dati per quella colonna, non avrà un record nella seconda tabella. Questa è la soluzione più pulita e non devi preoccuparti di gestire valori null o di dare un significato speciale a stringhe vuote.

NULL è un non valore che dovrebbe essere relegato nei secoli bui da cui è nato. Ho scoperto che è necessaria una quantità non banale di programmazione per gestire casi NULL speciali che potrebbero essere facilmente gestiti con un valore predefinito.

Imposta il valore predefinito per la tua colonna come stringa vuota. Forza la colonna a non consentire null, cosa che molto probabilmente non accadrà mai una volta assegnato un valore predefinito. Scrivi il tuo codice ignorando beato il caso in cui il valore della colonna è null.

Un grosso problema che ho sempre avuto con NULL è che " SELECT * da tbl WHERE colonna = NULL " restituirà sempre un set di risultati vuoto. NULL non può mai essere uguale a niente, incluso NULL. La parola chiave speical " colonna è nulla " è l'unico modo per verificare che qualcosa sia nullo. Se ti allontani da null, il confronto avrà esito positivo: " column = '' " 7 righe restituite.

Ho fatto due importanti implementazioni di DB da zero, dove alla fine mi sono pentito di aver usato NULL. La prossima volta, niente NULL per me!

C'è un'eccezione importante. Bill Karwin ha dichiarato che "CONCAT (NULL," pippo ") restituisce NULL" che è vero per la maggior parte dei RDBMS ma NON per Oracle.

Come suggerito da James Curran sopra, Oracle ha scelto questa congiuntura piuttosto critica per discostarsi dallo standard SQL trattando NULL e stringhe vuote esattamente uguali. Peggio che trattarli allo stesso modo, tuttavia, può effettivamente corrompere il significato di un valore NULL restituendo qualcosa di diverso da NULL durante la concatenazione.

In particolare, in Oracle CONCAT (NULL, 'foo') produce 'foo'. Grazie Oracle, ora ho perso i miei valori null che potrebbero non interessarti ma sicuramente fanno la differenza quando i dati vengono passati ad altri RDBMS per ulteriori elaborazioni.

A "nessun dato" il valore in una colonna deve essere rappresentato da un valore predefinito. Ricorda che NULL indica un valore sconosciuto, ovvero la colonna può avere un valore oppure no ma non lo conosci al momento.

In un sistema di domanda di prestito, ad esempio, un valore NULL nel campo Numero patente di guida indica che il richiedente o il responsabile del prestito non ha inserito il numero di patente di guida. Il valore NULL non significa automaticamente che il richiedente non ha una licenza. Potrebbe avere o meno una licenza, semplicemente non lo sai, ecco perché è NULL.

L'ambiguità sta nelle colonne stringa. Una colonna numerica contiene ovviamente uno zero se non c'è valore. Come si può rappresentare una stringa senza valore? Nell'esempio sopra, per i candidati senza patente di guida, è possibile assegnare un valore predefinito arbitrario come "nessuno". o meglio ancora una stringa vuota. Assicurati solo di utilizzare il valore vuoto predefinito nelle altre tabelle per coerenza.

Sulla questione di non usare i NULL come principio, ci sono casi in cui sono effettivamente essenziali. Come persona che lavora ampiamente con le statistiche, è comune per i fornitori di dati fornirti set di dati con dati incompleti. Ad esempio, in un set di dati del PIL per paese, è possibile trovare cifre del PIL mancanti negli anni precedenti e successivi. Uno dei motivi è che non ci sono dati ufficiali per quegli anni dal governo del paese. Sarà errato concludere che il loro PIL è zero (DUH!) E mostrare un valore zero nei dati estratti o in un grafico. Il valore corretto è NULL, il che significa che non hai ancora i dati. L'utente finale interpreta correttamente i punti dati mancanti nei dati estratti e nei grafici come NON zero. Inoltre, non causerà errori nei tuoi calcoli, specialmente quando fai le medie.

Alcune regole "quot" questo ha teoricamente senso in effetti sarebbe una soluzione scadente o errata nel tuo caso.

Trovo che i valori NULL siano utili per l'integrità referenziale. Nel caso di MySQL se un campo è impostato su NOT NULL, un inserimento richiede l'impostazione dei dati; in caso contrario, NULL è un valore possibile e il vincolo di chiave esterna non viene applicato.

  1. id: chiave primaria
  2. product_id: CHIAVE ESTERA NON NULL
  3. ref_id: (NULLABLE)

area id e product_id sempre richiesti. ref_id può essere impostato su NULL. Tuttavia, se viene utilizzato qualsiasi altro valore, deve soddisfare il vincolo FOREIGN KEY.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top