Enum oder Bool in mysql?

7

Einfache dumme Frage. Was ist besser?

Ein Bool oder ein Enum ('y', 'n')?

    
Sein Kraft 15.11.2010, 02:22
quelle

6 Antworten

15

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.

    
Niet the Dark Absol 15.11.2010, 02:32
quelle
5

TINYINT(1) - es sieht wie ein Boolescher aus, also mach es zu einem.

Vergleiche niemals intern mit Dingen wie y , wenn ein Boolescher Wert (0/1) verfügbar ist.

    
alex 15.11.2010 02:26
quelle
3

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'

ist

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.

    
joshnabbott 01.07.2011 21:32
quelle
2

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).

    
SEoF 08.03.2012 21:35
quelle
0

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.

    
Malvineous 15.11.2010 02:34
quelle
0

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.

    
user2045006 30.08.2016 23:39
quelle

Tags und Links