MySQL, besser NULL oder leere Zeichenfolge einfügen?

Ich habe ein Formular auf einer Website, die viele verschiedene Felder hat. Einige der Felder sind optional, während andere obligatorisch sind. In meiner DB habe ich eine Tabelle, die alle diese Werte enthält. Ist es besser, einen NULL-Wert oder eine leere Zeichenfolge in die DB-Spalten einzufügen, in die der Benutzer keine Daten eingegeben hat?

Mit NULL Sie zwischen “keine Daten setzen” und “leere Daten setzen” unterscheiden.

Einige weitere Unterschiede:

  • Eine LENGTH von NULL ist NULL , eine LENGTH von einer leeren Zeichenfolge ist 0 .

  • NULL s werden vor den leeren Strings sortiert.

  • COUNT(message) zählt leere Zeichenfolgen aber nicht NULL

  • Sie können nach einer leeren Zeichenfolge suchen, die eine gebundene Variable, aber nicht für einen NULL . Diese Abfrage:

     SELECT * FROM mytable WHERE mytext = ? 

    wird nie einen NULL in mytext , egal welchen Wert Sie vom Client übergeben. Um NULL s zu finden, müssen Sie eine andere Abfrage verwenden:

     SELECT * FROM mytable WHERE mytext IS NULL 

Wenn Sie jemals planen, databaseen zu wechseln, sollten Sie beachten, dass Oracle keine leeren Zeichenfolgen unterstützt . Sie werden automatisch in NULL konvertiert und Sie können sie nicht mit Klauseln wie WHERE somefield = '' .

Eine Sache, die Sie beachten sollten, ist, dass NULL Ihre Codepathen möglicherweise erheblich erschwert. In Python beispielsweise mappen die meisten databaseadapter / ORMs NULL zu None .

Dinge wie:

 print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 

könnte dazu führen, “Hallo, keine Joe Doe!” Um es zu vermeiden, benötigen Sie etwas wie diesen Code:

 if databaserow.title: print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow else: print "Hello, %(firstname) %(lastname)!" % databaserow 

Was die Dinge viel komplexer machen kann.

Lieber NULL für Konsistenz in Ihrer database in MySQL einfügen. Fremdschlüssel können als NULL aber NICHT als leere Zeichenfolgen gespeichert werden.

Sie werden Probleme mit einer leeren Zeichenfolge in den Einschränkungen haben. Möglicherweise müssen Sie einen falschen Datensatz mit einer eindeutigen leeren Zeichenfolge einfügen, um eine Fremdschlüsseleinschränkung zu erfüllen. Schlechte Praxis, denke ich.

Siehe auch: Kann ein Fremdschlüssel NULL sein und / oder duplizieren?

Ich weiß nicht, welche Best Practice hier wäre, aber ich würde mich im Allgemeinen für null entscheiden, es sei denn, Sie möchten, dass null etwas anderes bedeutet als leere Zeichenfolge, und die Eingabe des Benutzers stimmt mit Ihrer leeren Stringdefinition überein.

Beachten Sie, dass ich sage, dass Sie definieren müssen, wie Sie möchten, dass sie anders sind. Manchmal macht es Sinn, sie anders zu haben, manchmal nicht. Wenn nicht, wählen Sie einen aus und bleiben Sie dabei. Wie gesagt, ich bevorzuge die NULL die meiste Zeit.

Ach ja, und wenn die Spalte NULL ist, ist es weniger wahrscheinlich, dass der Datensatz in praktisch jeder Abfrage erscheint, die (in SQL-Termen) auf dieser Spalte basiert, sofern die Auswahl nicht für eine Nullspalte erfolgt Na sicher.

Wenn Sie mehrere Spalten in einem eindeutigen Index verwenden und mindestens eine dieser Spalten obligatorisch ist (dh ein erforderliches Formularfeld), erhalten Sie möglicherweise doppelte Zeilen, wenn Sie die anderen Spalten im Index auf NULL setzen. Das liegt daran, dass NULL-Werte in eindeutigen Spalten ignoriert werden. Verwenden Sie in diesem Fall leere Zeichenfolgen in den anderen Spalten des eindeutigen Index, um doppelte Zeilen zu vermeiden.

 SPALTEN IN EINEM EINZIGARTIGEN INDEX:
 (event_type_id, event_title, Datum, Ort, URL)

 BEISPIEL 1:
 (1, 'BBQ', '2018-07-27', null, null)
 (1, 'BBQ', '2018-07-27', null, null) // erlaubt und dupliziert.

 Beispiel 2:
 (1, 'BBQ', '2018-07-27', '', '')
 (1, 'BBQ', '2018-07-27', '', '') // NICHT erlaubt, da es dupliziert wird.

Hier sind einige Codes:

 CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `event_id` int(11) DEFAULT NULL, `event_title` varchar(50) DEFAULT NULL, `date` date DEFAULT NULL, `location` varchar(50) DEFAULT NULL, `url` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Jetzt fügen Sie dieses ein, um zu sehen, dass es die doppelten Zeilen erlaubt:

 INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, `url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL); INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, `url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL); 

Fügen Sie das ein und prüfen Sie, ob es nicht erlaubt ist:

 INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, `url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', ''); INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, `url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', ''); 

Also, hier gibt es kein richtig oder falsch. Es liegt an Ihnen, zu entscheiden, was mit Ihren Geschäftsregeln am besten funktioniert.