2012-04-05 5 views
12

MySQL bietet einen netten Operator <=>, der mit Vergleichen arbeitet, die eine Null wie null <=> null oder null <=> 5 usw. enthalten können, die intuitive Ergebnisse so viele Programmiersprachen zurückgeben. Wohingegen der normale equals-Operator immer nur null zurückgibt, was viele neue MySQL-Benutzer, wie mich selbst, schief nimmt.Gibt es einen Grund, nicht <=> (null Safe gleich Operator) in mysql statt =?

Gibt es einen Grund, warum MySQL beides hat und nicht nur die Funktionalität in <=>? Wer braucht wirklich einen Operator, der mit eingebauten Sprachtypen effektiv undefiniert ist?

Antwort

6

Der große Unterschied zwischen null in mySQL und in Programmiersprachen ist, dass in mySQL, null bedeuten unbekannt Wert, während bei der Programmierung bedeutet es undefined Wert.

In mySQL ist null nicht gleich null (unbekannt ist nicht gleich unbekannt). In Programmiersprachen ist null gleich null (undefined ist nicht definiert).

+3

Ja, aber gibt es einen logischen Grund dafür? Welches Problem der realen Welt wird dadurch leichter? – Jonathon

2

Gibt es einen Grund, warum MySql beides hat und nicht nur die Funktionalität in < => ? Die Betreiber sind völlig unterschiedlich voneinander.

<=> führt einen Gleichheitsvergleich wie der = Operator, sondern kehrt 1 statt NULL wenn beide Operanden sind NULL und 0 statt NULL wenn ein Operand NULL ist.

Wer braucht wirklich einen Operator, der mit eingebauten in Sprachtypen effektiv undefiniert ist?

Dies hängt von Fall, nur weil Sie solche Fälle nicht aufgetreten sind, bedeutet nicht, dass niemand es braucht.

+0

Kann jemand an irgendwelche Fälle denken? Weil ich nicht zurückdenken kann, wo ich in über einem Jahrzehnt professioneller Entwicklung das Verhalten von = <=> hätte verwenden können. – cellige

+0

Ich könnte die Verwendung sehen, wenn = ein anderes Verhalten zur Verfügung stellt, aber es bietet kein Verhalten, wenn mit NULL verwendet, da das Ergebnis immer Null ist, solange Null im Ausdruck ist. – cellige

+2

@cellige Es bietet keine (sinnvoll, nützlich) Verhalten bei Verwendung mit einem NULL-Literal. Aber wenn zwei nicht-literale und nullable Ausdrücke verglichen werden, tut es definitiv etwas, was jemand vernünftigerweise dazu haben möchte. –

10

Wer braucht wirklich einen Operator, der mit eingebauten Sprachtypen effektiv undefiniert ist?

Sie haben nach einigen Beispielen aus der Praxis gefragt. Hier ist eine falsche. Nehmen wir an, Sie haben ein Jugendprogramm oder ähnliches, und eine der Voraussetzungen ist, dass die Kinder nur ein Zimmer mit jemandem des gleichen Geschlechts teilen. Sie haben in der Datenbank ein Nullable-Feld (M/F) - NULL-Werte, weil Ihr Daten-Feed unvollständig ist (Sie suchen immer noch nach einigen Daten). Ihr Zimmer-übereinstimmender Code sollte definitiv nicht mit Studenten übereinstimmen, wo t1.Gender < => t2.Gender, weil es am Ende zwei Kinder mit unbekanntem Geschlecht, die von entgegengesetzten Geschlechtern sein könnte. Stattdessen stimmen Sie überein, wo sie gleich sind und nicht beide null.

Das ist nur ein Beispiel. Ich gebe zu, dass das Verhalten von NULL und der = Operator eine Menge Verwirrung im Laufe der Jahre verursacht haben, aber letztlich liegt der Fehler wahrscheinlich an der Fülle von Online MySQL Tutorials, die nicht erwähnen, wie NULL mit Betreibern interagiert, noch von der Existenz von der Operator <=>.

+0

Schönes Beispiel. Zu paraphrasieren und möglicherweise zu erarbeiten. 'Null'-Ausdrücke können nützlich sein, wenn Felder eine endliche Anzahl von möglichen Werten haben, die Felder jedoch bis zu einem späteren Zeitpunkt in der Ausführung der Anwendung undefiniert sein können? – PdC

+0

Ich würde einen Schritt weiter gehen - ich verstehe nicht, warum sie auch nur mit einer endlichen Anzahl von Werten nützlich sind (offensichtlich haben alle SQL-Felder eine endliche Anzahl von Werten, aber ich nehme an, du meinst eine _kleine_ endliche Zahl !) Nullwerte funktionieren in allen Arten von Fällen, in denen Datenwerte nicht bekannt sind (ob sie später bekannt sind oder nicht). – almcnicoll

4

Wer braucht wirklich einen Operator, der mit eingebauten in Sprachtypen effektiv undefiniert ist?

Sie brauchen es auch für Relationen innerhalb Ihrer Datenbank. speziell wenn Sie Fremdschlüsseleinschränkungen verwenden.

zum Beispiel, wenn Sie eine Tabelle für Aufgaben (in Ihrer Firma) haben. Dann weisen Sie diese Aufgaben den Mitarbeitern zu. Sie haben also eine Beziehung von Ihrer Aufgaben-Tabelle zu Ihrer Mitarbeiter-Tabelle.
und es wird immer einige nicht zugewiesene Aufgaben geben. In diesem Fall enthält das Feld in Ihrer Aufgaben-Tabelle, die Sie für die Beziehung zur Tabelle employees verwenden, NULL. Dies stellt sicher, dass diese Aufgabe nicht zugewiesen ist. was bedeutet: Es gibt keine Möglichkeit, dass eine Beziehung zum Mitarbeitertisch besteht.

wenn NULL = NULLtrue wäre, dann in meinem Beispiel gäbe es immer die Möglichkeit, dass die Fremdschlüssel in der Tabelle employees auch NULL ist. somit wäre die Aufgabe einem oder mehreren Mitarbeitern zugeordnet. und Sie könnten nie sicher wissen, ob eine Aufgabe einem Mitarbeiter zugewiesen wurde oder nicht.