Frage

Da MySQL scheint keinen ‚boolean‘ Datentyp zu haben, den Datentyp sind Ihnen ‚Missbrauch‘ zum Speichern von Wahr / Falsch-Informationen in MySQL?

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

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

  • Tinyint, VARCHAR-Felder enthalten die Werte 0/1,
  • varchar Felder die Saiten '0' / '1' oder 'true' / 'false'
  • enthalten
  • und schließlich Enum Felder die beiden Optionen 'true' / 'false'.
  • enthalten

Keine der oben genannten scheint optimal. Ich neige dazu, die Tinyint 0/1 Variante zu bevorzugen, da die automatische Typumwandlung in PHP gibt mir Boolesche Werte eher einfach.

So, den Datentypen verwenden Sie? Gibt es eine Art für Boolesche Werte entworfen, die ich übersehen habe? Haben Sie irgendwelche Vorteile / Nachteile sehen durch eine oder andere Art mit?

War es hilfreich?

Lösung

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

  

Ab MySQL 5.0.3 wird der BIT-Datentyp zu speichern Bit-Feld verwendet   Werte. Eine Art von BIT (M) ermöglicht die Speicherung von M-Bit-Werten. M kann im Bereich   von 1 bis 64.

Ansonsten nach dem MySQL-Handbuch Sie Bool und boolean, die sind im Moment leider Aliase Tinyint (1):

  

Bool, Boolean: Diese Typen sind Synonyme für TINYINT (1). Ein Wert von   Null ist falsch betrachtet. Nicht-Null   Werte gelten als wahr.

MySQL auch fest, dass:

  

Wir wollen volle boolean implementieren   Typ Handhabung, in Übereinstimmung mit   Standard-SQL, in einem zukünftigen MySQL   Release.

Referenzen: http: //dev.mysql. com / doc / refman / 5.5 / de / numeric-type-overview.html

Andere Tipps

BOOL und BOOLEAN sind Synonymen für TINYINT(1). Zero ist false, alles andere ist true. Weitere Informationen hier .

Dies ist eine elegante Lösung, die ich sehr zu schätzen wissen, weil es null Datenbytes verwendet:

some_flag CHAR(0) DEFAULT NULL

Um es auf true gesetzt some_flag = '' gesetzt und es auf false gesetzt some_flag = NULL zu setzen.

Dann für wahr zu testen, ob some_flag IS NOT NULL und für falsch zu testen, ob some_flag IS NULL.

(Diese Methode ist beschrieben in "High Performance MySQL: Optimierung, Backups, Replikation und mehr". Jon Warren Lentz, Baron Schwartz und Arjen Lentz)

Diese Frage wurde beantwortet, aber ich dachte, ich in meinem $ 0.02 werfen würde. Ich benutze oft eine CHAR (0), wobei '' == true und NULL == false.

mysql docs

  

CHAR (0) ist auch ganz schön, wenn man eine Spalte benötigen, die nur nehmen können   zwei Werte: eine Spalte, die als CHAR (0) definiert ist, NULL belegt nur einen   Bit und kann nur die Werte nehmen NULL und '' (leerer String).

Wenn Sie den BOOLEAN Typ verwenden, wird dies aliased zu TINYINT (1). Dies ist am besten, wenn Sie standardisierte SQL verwenden möchten, und haben nichts dagegen, dass das Feld ein außerhalb des zulässigen Bereichs Wert enthalten könnte (im Grunde alles, was nicht 0 ist wird ‚true‘).

ENUM ( ‚False‘, ‚True‘) lassen Sie die Zeichenfolge in der SQL verwenden, und MySQL wird das Feld intern als Integer speichern, wo ‚False‘ = 0 und ‚True‘ = 1 in der Reihenfolge an dem Enum angegeben.

In MySQL 5+ Sie BIT (1) Feld einen 1-Bit numerischen Typen, um anzuzeigen, verwenden können. Ich glaube nicht, das ist eigentlich jeden weniger Platz im Speicher verwendet aber auch hier können Sie die möglichen Werte auf 1 oder 0 beschränken.

Alle oben wird in etwa die gleiche Menge an Speicher verwenden, so ist es am besten die, die Sie am einfachsten mit der Arbeit finden holen.

Ich benutze TINYINT (1), um Boolesche Werte in Mysql zu speichern.

Ich weiß nicht, ob es irgendein Vorteil ist, diese zu verwenden ... Aber wenn ich nicht falsch bin, kann mysql speichern boolean (BOOL) und speichert es als tinyint (1)

http: //dev.mysql. com / doc / refman / 5.0 / de / andere Vendor-data-types.html

Bit ist nur von Vorteil, über die verschiedenen Byte-Optionen (tinyint, Enum, char (1)), wenn Sie eine Menge von Booleschen Felder haben. Ein Bit-Feld nimmt immer noch eine volle Byte. Zwei Bit-Felder passen in das gleiche Byte. Drei, vier, fünf, sechs, sieben, acht. Nach dem Starten sie das nächste Byte auffüllt. Letztlich sind die Einsparungen so klein ist, gibt es Tausende von anderen Optimierungen sollten Sie konzentrieren sich auf. Es sei denn, Sie mit einer enormen Menge an Daten zu tun hat, sind die wenigen Bytes gehen, summieren sich zu viel nicht. Wenn Sie etwas mit PHP sind müssen Sie die Werte typisieren und ausgehen.

Bis MySQL implementiert ein Bitdatentyp, wenn Ihre Verarbeitung wirklich für Raum und / oder Zeit gedrückt wird, wie mit hochvolumigen Transaktionen, erstellen Sie ein TINYINT Feld bit_flags für alle Booleschen Variablen genannt, und die Maske und verschieben die Boolesche Bit Sie Wunsch in der SQL-Abfrage.

Zum Beispiel, wenn Ihr am weitesten links gelegene Bit Ihre Bool Feld darstellt, und die 7 am weitesten rechts stehenden Bits nichts darstellen, dann wird Ihr bit_flags Feld 128 (binär 10000000) gleich. Maske (ausgeblendet) der sieben am weitesten rechts stehenden Bits (mit dem Bit-Operator &) und verschieben das achte Bit sieben Stellen nach rechts, enden mit 00000001. Nun ist die ganze Zahl (die in diesem Fall ist 1) ist der 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 Aussagen wie diese laufen, wie Sie testen

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

etc.

Da Sie 8 Bits haben, haben Sie möglicherweise 8 boolean Variablen aus einem Byte. Einige zukünftige Programmierer verwenden immer die nächsten sieben Bits, so dass Sie muss Maske. Nicht nur verschieben, oder Sie werden in Zukunft für sich selbst und andere Hölle schaffen. Stellen Sie sicher, dass MySQL Ihre Maskierung tun und Verschieben - dies erheblich schneller sein wird, die Web-Skriptsprache (PHP, ASP, etc.) tut es, als wenn. Also, stellen Sie sicher, dass Sie einen Kommentar im Kommentarfeld MySQL Platz für Ihr bit_flags Feld.

Sie werden diese Seiten nützlich bei der Implementierung dieser Methode finden:

habe mich mit dem Versuch Nullen satt zu bekommen, NULLS und ‚‘ genau um eine Schleife von PHP, mySQL und POST-Werten, so dass ich nur mit ‚Ja‘ und ‚Nein‘.

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

Sie auf diesen Link Bezug      Boolesche Datentyp in Mysql , nach dem Anwendungsnutzung, wenn man nur 0 oder 1 gespeichert werden will, Bit (1) ist die bessere Wahl.

Nachdem die Antworten zu lesen hier habe ich beschlossen, bit(1) zu verwenden und ja, es ist irgendwie besser in Raum / Zeit, ABER nach einer Weile habe ich meine Meinung geändert und ich werde es nie wieder benutzen. Es ist kompliziert meine Entwicklung viel, wenn mit Prepared Statements, Bibliotheken usw. (php).

Seitdem ich immer tinyint(1) verwenden, scheint gut genug.

Da MySQL (8.0.16) und MariaDB (10.2.1) sowohl die CHECK-Einschränkung umgesetzt, würde ich jetzt verwenden

bool_val TINYINT CHECK(bool_val IN(0,1))

Sie werden nur in der Lage sein, 0, 1 oder NULL zu speichern, sowie Werte, die ohne Fehler wie 0, 1, '1' oder 0x00 / b'1' zu TRUE oder FALSE umgewandelt werden kann.

Wenn Sie nicht möchten, dass NULL-Werte ermöglichen, fügen Sie die Option NOT NULL

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

Beachten Sie, dass es praktisch keinen Unterschied, ob Sie TINYINT, TINYINT(1) oder TINYINT(123) verwenden.

Wenn Sie Ihr Schema wollen aufwärtskompatibel sein, können Sie auch BOOL oder BOOLEAN verwenden können,

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db <> Geige Demo

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top