Tach!
Warum sollte man nun ausgerechnet nur die 0 nicht verwenden?
Also so wie das in meinen Augen aussieht könnte die 0 eine gültige ID sein, wird aber offenbar als Merkmal für "kein Benutzer gewählt" genommen. Ich würde da auf eine, als ID per Definition ungültige Zahl (z.B. -1) zurückgreifen.
Wessen Definition? Wenn das vorliegende System die 0 als ungültig definiert, ist doch ebenfalls alles bestens.
Freilich gänge auch NULL oder FALSE, das würde aber einen strengen Typvergleich erfordern und müsste sehr genau getestet bzw. die Dokumentation sehr genau nachgelesen werden,
Wenn 0 eine gültige Usernummer wäre. Scheint aber in dem Fall nicht zu sein, so dass ein typungenauer Test auf falsy völlig ausreichend ist.
wie ich gleich mal zeige:
Man kann auch zeigen, dass 2 x 3 = 4 macht, in irgendeinem anderen Zusammenhang. Welche Relevanz hat eine solche Überlegung für ein System, das nahezu unbekannt ist? Natürlich kann man preventiv-theoretisch irgendwelche Fallstricke beschreiben. Wo will man dann aber aufhören? Ein Fallstick kann sich mit jedem beliebigen Wert ergeben, wenn das unbekannte System darauf anspringt. Diese Diskussion über mögliche Probleme eines unbekannten Systems empfinde ich als nicht sinnvoll, weil sie keinerlei konkreten Nutzen bringt. Auch nicht für andere Systeme, deren Voraussetzungen unbekannt sind. Mit meine Übertreibungen wollte ich das Groteske aufzeigen, in das sich das Thema steigern lässt, wenn man das eine Argument konsequent weiterführt.
mysql> SELECT 'Unbekannt' AS View, NULL AS Value UNION SELECT 'foo' AS FullName, '100' AS UserID;
+-----------+-------+
| View | Value |
+-----------+-------+
| Unbekannt | NULL | # <- kein Typeswitch
| foo | 100 |
+-----------+-------+
NULL ist ja auch kein Wert irgendeines Typs. NULL ist nichts, und nichts kann man in keinen anderen Typ konvertieren. Das NULL bewirkt in dem Fall lediglich, dass die Ergebnisspalte auf nullable gesetzt wird. Zu sehen beispielswiese mit mysqli_fetch_fields() unter flags. Als Typ kommt für beide Spalten varbinary raus (die 100 ist ja ebenfalls als String angegeben).
mysql> SELECT 'Unbekannt' AS View, FALSE AS Value UNION SELECT 'foo' AS FullName, '100' AS UserID;
+-----------+-------+
| View | Value |
+-----------+-------+
| Unbekannt | 0 | # <- Nicht erwarteter Typeswitch von FALSE zu O
| foo | 100 |
+-----------+-------+
In dem Fall ist wieder die Erwartungshaltung nicht mit der Realität kompatibel. Es gibt keinen booleschen Typ in MySQL. FALSE ist eine Konstante mit dem Wert 0. Datentyp der Ergebnisspalte ist immer noch varbinary wegen der String-100.
Was da ggf. bei einem Wechsel des DBMS passiert kann man nur erahnen.
Man kann auch die Dokumentation der verwendeten Systeme lesen und die eigene Erwartungshaltung nicht als das Maß der Dinge ansehen. Haben fehlerhafte Erwartungshaltungen nicht schon zu viel zu vielen Sicherheitslücken geführt?
Natürlich habe auch ich Erwartungshaltungen, aber ich erwarte ebenso, dass sie falsch sein können. Im Zweifelsfall ist mir die Dokumentation ein besserer Ratgeber. Selbst bei der schließt meine Art von Erwartungshaltung nicht aus, dass da keine Fehler drin sind. Das Vergleichen der Erwartungshaltung mit dem Resultat eines Vorgangs ist für mich als Programmierer ein essentieller Vorgang.
mysql> SELECT 'Unbekannt' AS View, -1 AS Value UNION SELECT 'foo' AS FullName, '100' AS UserID;
+-----------+-------+
| View | Value |
+-----------+-------+
| Unbekannt | -1 | # bleibt stets brav bei -1
| foo | 100 |
+-----------+-------+
Nein, wird wegen der String-100 nach varbinary konvertiert. Hier stimmt nur die Erwartungshaltung mit der fehlerhaften Interpretation des Ergebnisses überein. Auch das ist nicht gerade ein Argument für Erwartungshaltungen.
Und die Erde dreht sich trotzdem noch.
Nun, ich habe einen Hinweis zum ganz frühzeitigen "Mist vermeiden" gegeben. Es bringt vorliegend niemanden um wenn dem jemand nicht folgt und bei Programmieren seine eigenen Definitionen im Hinterkopf hat.
Natürlich bringt das niemanden um. Man kann auch dem Lehrling empfehlen, beim WLAN-Kabel nicht an die blanken Kontakte zu fassen. Bringt den auch nicht um, aber auch nicht weiter in seinem beruflichen Leben.
dedlfix.