Einfache dumme Frage. Was ist besser?
Ein Bool oder ein Enum ('y', 'n')?
BOOLEAN ist ein Alias für TINYINT (1) und wird als ein Byte Daten gespeichert.
ENUM ('y', 'n') wird ebenfalls als 1 Byte Daten gespeichert.
Aus Sicht der Speichergröße ist beides nicht besser.
Sie können jedoch 9 in einem BOOLEAN-Feld speichern und es wird akzeptiert. Wenn Sie also nur zwei Zustände erzwingen wollen, gehen Sie zu ENUM.
Hier ist das Problem beim Speichern boolescher Werte als enum:
SELECT count(*) FROM people WHERE is_active = true;
# = & gt; Gibt 0 zurück, weil true! = 'True'
Was irreführend ist, weil:
SELECT count(*) FROM people WHERE is_active = 'true';
# = & gt; Gibt 10 zurück
Wenn Sie alle Ihre eigenen SQL-Abfragen schreiben, würden Sie wissen, dass Sie keinen Ausdruck in Ihre Abfrage eingeben müssen. Wenn Sie jedoch ein ORM verwenden, werden Sie Probleme bekommen, da ein ORM normalerweise dazu dient Konvertiere den Ausdruck in etwas, das die Datenbank, die abgefragt werden soll, verstehen kann ('t' / 'f' für SQLite; 0/1 für MySQL etc.)
Kurz gesagt, während die eine auf der Byte-Ebene nicht schneller als die andere sein kann, sollten Booleans als Ausdrücke gespeichert werden, damit sie mit anderen Ausdrücken verglichen werden können.
Zumindest sehe ich das so.
Beide sind am besten für die Speicherung eines einzelnen Bits (oder Boolean). Die Enumeration verfügt über eine Nachschlagetabelle und speichert die Antwort als Ganzzahl. Der Boolean ist eigentlich nur ein Alias für "TINYINT (1)", was technisch 8 Bits an Information ist. Der Bitdatentyp speichert nur so viele Bits wie in seiner Definition (wie im Varchar-Typ), so dass ein Bit (1) buchstäblich nur ein Bit speichert. Wenn Sie jedoch nur eines dieser Felder haben, ist die Frage strittig, da nichts die verbleibenden Bits füllt, so dass sie in jeder Zeile ungenutzter Platz sind (die Menge an Platz wird in jeder Zeile typischerweise auf mindestens ein Byte aufgerundet) 8 Bits pro Zeile).
Abhängig von der Sprache, die Sie für die Verbindung mit der Datenbank verwenden, können Sie Groß- und Kleinschreibung mit enum umgehen, z. B. wenn Ihre Datenbank ein Kleinbuchstabe "y" verwendet, Ihr Code jedoch ein Großbuchstabe "Y" erwartet. Ein Bool / Tinyint wird immer 0 oder 1 (oder NULL) sein, so dass dieses Problem vermieden wird.
Viele Standard-Ratschläge verwenden BOOL
/ TINYINT(1)
, aber wie in der Antwort unter Ссылка dies erlaubt 9 Variationen von TRUE
.
In vielen Fällen ist das egal, aber wenn Ihre Spalte Teil eines eindeutigen Indexes ist, wird dies zu einem Problem werden.
Falls Sie die Spalte in einem eindeutigen Index verwenden, würde ich BIT(1)
empfehlen.
ENUM
funktioniert auch gut mit einem eindeutigen Index (vorausgesetzt, Sie haben einen geeigneten SQL-Modus festgelegt.) Allerdings würde ich ENUM nur verwenden, wenn Sie mit String-Repräsentationen von Wahr / Falsch anstelle von tatsächlichen booleschen Werten arbeiten möchten.