Frage Welcher MySQL-Datentyp wird zum Speichern boolescher Werte verwendet?


Da MySQL keinen 'booleschen' Datentyp zu haben scheint, welchen Datentyp 'missbrauchen' Sie für das Speichern von Wahr / Falsch-Informationen in MySQL?

Vor allem im Zusammenhang mit dem Schreiben und Lesen von / zu einem PHP-Skript.

Im Laufe der Zeit habe ich mehrere Ansätze benutzt und gesehen:

  • Tinyint, Varchar Felder mit den Werten 0/1,
  • varchar Felder mit den Strings '0' / '1' oder 'true' / 'false'
  • und schließlich enum Felder mit den beiden Optionen 'true' / 'false'.

Keines der oben genannten scheint optimal zu sein. Ich bevorzuge die Tinyint 0/1 Variante, da die automatische Typumwandlung in PHP mir boolesche Werte gibt.

Welchen Datentyp verwendest du? Gibt es einen Typ für boolesche Werte, den ich übersehen habe? Sehen Sie Vorteile / Nachteile, wenn Sie den einen oder anderen Typ verwenden?


990
2017-11-14 10:36


Ursprung


Antworten:


Für MySQL 5.0.3 und höher können Sie verwenden BIT. Das Handbuch sagt:

Ab MySQL 5.0.3 wird der Bit-Datentyp zum Speichern von Bitfeldern verwendet   Werte. Ein Typ von BIT (M) ermöglicht das Speichern von M-Bit-Werten. M kann reichen   von 1 bis 64.

Ansonsten können Sie gemäß dem MySQL-Handbuch bool und boolean verwenden, die momentan Aliase von sind Tinyint(1):

Bool, Boolean: Diese Typen sind Synonyme für Tinyint(1). Ein Wert von   Null wird als falsch angesehen. Nicht Null   Werte gelten als wahr.

MySQL stellt außerdem Folgendes fest:

Wir beabsichtigen, boolean zu implementieren   Typ Handhabung, in Übereinstimmung mit   Standard-SQL, in einem zukünftigen MySQL   Freisetzung.

Verweise: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

Übrigens: Das ist nur eine Frage von https://google.com/search?q=mysql+boolean+datatype.

Komisch ist es nicht, dieser Link, vor ein paar Jahren gepostet, ist rekursiv geworden.


1064
2017-11-14 10:50



BOOL und BOOLEAN sind Synonyme von TINYINT(1). Null ist falsealles andere ist true. Mehr Informationen Hier.


200
2017-11-14 10:55



Dies ist eine elegante Lösung, die ich sehr schätze, da sie null Datenbytes verwendet:

some_flag CHAR(0) DEFAULT NULL

Um es auf wahr zu setzen, setze some_flag = '' und um es auf falsch einzustellen, setze es some_flag = NULL.

Um dann auf wahr zu prüfen, überprüfen Sie, ob einige_flagge IS NOT NULL, und um auf falsch zu prüfen, überprüfen Sie, ob some_flag IS NULL.

(Diese Methode wird in "Hochleistungs-MySQL: Optimierung, Backups, Replikation und mehr" von Jon Warren Lentz, Baron Schwartz und Arjen Lentz beschrieben.)


64
2018-02-10 18:09



Diese Frage wurde beantwortet, aber ich dachte, ich würde meine $ 0,02 einwerfen. Ich verwende oft ein CHAR (0), wobei '' == wahr und NULL == falsch ist.

Von MySQL-Dokumente

CHAR (0) ist auch ziemlich nett, wenn Sie eine Spalte brauchen, die nur nehmen kann   Zwei Werte: Eine Spalte, die als CHAR (0) NULL definiert ist, belegt nur eine   Bit und kann nur die Werte NULL und '' (die leere Zeichenfolge) nehmen.


32
2018-04-30 17:39



Wenn Sie den BOOLEAN-Typ verwenden, wird Alias ​​für TINYINT (1) verwendet. Dies ist am besten, wenn Sie standardisiertes SQL verwenden möchten und es nicht stören, dass das Feld einen Wert außerhalb des Bereichs enthalten kann (im Grunde ist alles, was nicht 0 ist, "wahr").

Mit ENUM ('False', 'True') können Sie die Strings in Ihrem SQL verwenden, und MySQL speichert das Feld intern als Ganzzahl, wobei 'False' = 0 und 'True' = 1 sind, basierend auf der Reihenfolge der Enum .

In MySQL 5+ können Sie ein BIT (1) -Feld verwenden, um einen 1-Bit-numerischen Typ anzugeben. Ich glaube nicht, dass dies tatsächlich weniger Platz im Speicher benötigt, aber Sie können die möglichen Werte wieder auf 1 oder 0 beschränken.

Alle oben genannten Punkte verwenden ungefähr die gleiche Menge an Speicherplatz. Daher ist es am besten, diejenige auszuwählen, mit der Sie am einfachsten arbeiten.


28
2017-11-14 14:59



Ich verwende TINYINT (1), um boolesche Werte in Mysql zu speichern.

Ich weiß nicht, ob es einen Vorteil gibt, dies zu benutzen ... Aber wenn ich nicht falsch liege, kann mysql boolean (BOOL) speichern und es als Tinyint speichern (1)

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html


16
2017-11-14 10:42



Bit ist nur vorteilhaft gegenüber den verschiedenen Byte-Optionen (tinyint, enum, char (1)), wenn Sie viele boolesche Felder haben. Ein Bitfeld belegt immer noch ein ganzes Byte. Zwei Bitfelder passen in dasselbe Byte. Drei, vier, fünf, sechs, sieben, acht. Danach beginnen sie das nächste Byte aufzufüllen. Letztendlich sind die Einsparungen so gering, dass es Tausende anderer Optimierungen gibt, auf die Sie sich konzentrieren sollten. Wenn Sie nicht mit einer enormen Menge an Daten zu tun haben, werden diese paar Bytes nicht zu viel ergeben. Wenn Sie Bit mit PHP verwenden, müssen Sie die ein- und ausgegebenen Werte typisieren.


14
2018-01-12 16:18



Bis MySQL einen Bit-Datentyp implementiert, erstellen Sie ein TINYINT-Feld mit dem Namen, wenn Ihre Verarbeitung wirklich aus Platz- und / oder Zeitgründen ausgeführt wird, z. B. bei Transaktionen mit hohem Volumen bit_flags für alle booleschen Variablen, und maskiere und verschiebe das gewünschte boolesche Bit in deiner SQL-Abfrage.

Zum Beispiel, wenn Ihr am weitesten links stehendes Bit Ihr Bool-Feld repräsentiert, und die 7 rechten Bits nichts darstellen, dann ist Ihr bit_flags Feld ist gleich 128 (binär 10000000). Maskiere (verstecke) die sieben rechten Bits (mit dem bitweisen Operator) &), und verschiebe das achte Bit um sieben Felder nach rechts, bis es mit 00000001 endet. Jetzt ist die ganze Zahl (die in diesem Fall 1 ist) dein Wert.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

Sie können beim Testen solche Anweisungen ausführen

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

etc.

Da Sie 8 Bits haben, haben Sie möglicherweise 8 boolesche Variablen von einem Byte. Ein zukünftiger Programmierer wird ausnahmslos die nächsten sieben Bits benutzen, also Sie Muss Maske. Verschiebe dich nicht, sonst wirst du in Zukunft die Hölle für dich und andere schaffen. Stellen Sie sicher, dass MySQL maskiert und verschoben wird - dies wird wesentlich schneller sein als die Web-Skriptsprache (PHP, ASP, etc.). Stellen Sie außerdem sicher, dass Sie einen Kommentar in das Feld "MySQL-Kommentar" für Ihren Kommentar eingeben bit_flags Feld.

Sie finden diese Sites hilfreich, wenn Sie diese Methode implementieren:


12
2017-07-13 17:13



Ich hatte es satt, Nullen, NULLEN und genau eine Schleife von PHP-, MySql- und POST-Werten zu erzeugen, also benutze ich einfach 'Ja' und 'Nein'.

Dies funktioniert einwandfrei und benötigt keine spezielle Behandlung, die nicht offensichtlich und einfach zu tun ist.


9
2017-07-09 20:10



Unter diesem Link      Boolescher Datentyp in MysqlJe nach Anwendungsnutzung ist Bit (1) die bessere Wahl, wenn nur 0 oder 1 gespeichert werden soll.


4
2018-02-23 10:41



Nachdem ich die Antworten hier gelesen hatte, entschied ich mich zu verwenden bit(1) und ja, es ist irgendwie besser in Raum / Zeit, ABER Nach einer Weile habe ich meine Meinung geändert und werde sie nie wieder verwenden. Es hat meine Entwicklung sehr kompliziert gemacht, wenn ich vorgefertigte Anweisungen, Bibliotheken usw. (PHP) verwende.

Seitdem benutze ich immer tinyint(1), scheint gut genug zu sein.


0
2018-06-26 10:14