Da MySQL keinen 'booleschen' Datentyp zu haben scheint, welchen Datentyp 'missbrauchen' Sie, um wahre / falsche Informationen in MySQL zu speichern?
Besonders im Zusammenhang mit dem Schreiben und Lesen von / zu einem PHP-Skript.
Im Laufe der Zeit habe ich verschiedene Ansätze verwendet und gesehen:
- tinyint, varchar Felder mit den Werten 0/1,
- Varchar-Felder mit den Zeichenfolgen '0' / '1' oder 'true' / 'false'
- und schließlich Felder auflisten, die die beiden Optionen 'true' / 'false' enthalten.
Keines der oben genannten scheint optimal zu sein. Ich bevorzuge eher die tinyint 0/1-Variante, da die automatische Typkonvertierung in PHP mir ziemlich einfach boolesche Werte liefert.
Welchen Datentyp verwenden Sie? Gibt es einen Typ für boolesche Werte, den ich übersehen habe? Sehen Sie Vor- oder Nachteile bei der Verwendung des einen oder anderen Typs?
mysql
boolean
sqldatatypes
Peter Mortensen
quelle
quelle
bit(1)
Ein Bit ** zum Importieren in Excel. Umschalten auftinyint(1)
funktioniert.Antworten:
Für MySQL 5.0.3 und höher können Sie verwenden
BIT
. Das Handbuch sagt:Andernfalls können Sie laut MySQL-Handbuch bool und boolean verwenden, die derzeit Aliase von tinyint (1) sind:
MySQL gibt außerdem Folgendes an:
Referenzen: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
quelle
!$boolean
ohne weitere Verarbeitung niemals richtig ausgewertet wird.auto_increment
eine Spalte verwenden, die einen booleschen Wert darstellt?BOOL
undBOOLEAN
sind Synonyme vonTINYINT(1)
. Null istfalse
, alles andere isttrue
. Weitere Informationen hier .quelle
(1)
macht nichts weiter als zu bestimmen, wie der Wert angezeigt wird. Wenn Sie sich der Speichergröße bewusst sind, möchten SieBIT
stattdessen verwendenBIT(1)
undTINYINT(1)
beide verwenden ein Byte Speicher. Bis MySQL 5.0.3BIT
war eigentlich ein Synonym fürTINYINT
. Spätere Versionen von MySQL haben die Implementierung von BIT geändert. Aber selbst mit der Implementierungsänderung gibt es für denBIT
Datentyp immer noch keinen Vorteil der "Speichergröße" (zumindest bei InnoDB und MyISAM; andere Speicher-Engines, z. B. NDB, haben möglicherweise eine Speicheroptimierung für mehrere BIT-Spaltendeklarationen.) Das größere Problem ist, dass einige Clients Bibliotheken erkennen zurückgegebeneBIT
Datentypspalten nicht oder behandeln sie nicht angemessen . ATINYINT
funktioniert besser.true
" ist nicht wahr.SELECT 'foo' AS bar FROM dual WHERE -7
. Der Ausdruck -7 wird in einem booleschen Kontext ausgewertet, und die Abfrage gibt eine Zeile zurück. Wir können mit 0 oder einem beliebigen Ausdruck testen, der den ganzzahligen Wert 0 ergibt, und es wird keine Zeile zurückgegeben. Wenn der Ausdruck in der WHERE-Klausel einen anderen ganzzahligen Wert ungleich Null als Null ergibt, ist der Ausdruck TRUE. (Ich glaube, Dezimal- und Gleitkommawerte werden auf Ganzzahl "gerundet", z . B.WHERE 1/3
aufWHERE 0
. Wir erhalten das gleiche Ergebnis mitWHERE 'foo'
, da Zeichenfolge'foo'
auch auf Ganzzahlwert 0 ausgewertet wird.Dies ist eine elegante Lösung, die ich sehr schätze, da sie keine Datenbytes verwendet:
Um es auf true zu setzen, setze
some_flag = ''
und um es auf false zu setzen, setzesome_flag = NULL
.Um dann auf true zu testen, überprüfen Sie, ob some_flag
IS NOT NULL
und um auf false zu testen, überprüfen Sie, ob some_flagIS NULL
.(Diese Methode wird in "Hochleistungs-MySQL: Optimierung, Backups, Replikation und mehr" von Jon Warren Lentz, Baron Schwartz und Arjen Lentz beschrieben.)
quelle
COMMENT
in der Definition der Spalte,NULL
die false und''
true angibt, einen sehr kleinen Beitrag zur Unterstützung des zukünftigen Verständnisses leisten.Wenn Sie den Typ BOOLEAN verwenden, ist dies auf TINYINT (1) ausgerichtet. Dies ist am besten, wenn Sie standardisiertes SQL verwenden möchten und nicht bedenken, 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 Zeichenfolgen in Ihrem SQL verwenden, und MySQL speichert das Feld intern als Ganzzahl, wobei 'False' = 0 und 'True' = 1, basierend auf der Reihenfolge, in der die Aufzählung angegeben ist .
In MySQL 5+ können Sie ein BIT (1) -Feld verwenden, um einen numerischen 1-Bit-Typ anzugeben. Ich glaube nicht, dass dies tatsächlich weniger Speicherplatz im Speicher beansprucht, aber Sie können die möglichen Werte wieder auf 1 oder 0 beschränken.
Alle oben genannten Funktionen belegen ungefähr die gleiche Speichermenge. Wählen Sie daher am besten diejenige aus, mit der Sie am einfachsten arbeiten können.
quelle
Diese Frage wurde beantwortet, aber ich dachte, ich würde meine $ 0,02 einwerfen. Ich benutze oft ein
CHAR(0)
, wo'' == true and NULL == false
.Aus MySQL-Dokumenten :
quelle
''
undnull
falsche Werte.Ich benutze TINYINT (1), um boolesche Werte in MySQL zu speichern.
Ich weiß nicht, ob es einen Vorteil gibt, dies zu verwenden ... Aber wenn ich mich nicht irre, 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
quelle
Bit ist gegenüber den verschiedenen Byteoptionen (tinyint, enum, char (1)) nur dann von Vorteil, wenn Sie viele boolesche Felder haben. Ein Bitfeld nimmt immer noch ein volles Byte ein. Zwei Bitfelder passen in dasselbe Byte. Drei, vier, fünf, sechs, sieben, acht. Danach füllen sie das nächste Byte auf. Letztendlich sind die Einsparungen so gering, dass Sie sich auf Tausende anderer Optimierungen konzentrieren sollten. Wenn Sie nicht mit einer enormen Datenmenge zu tun haben, summieren sich diese wenigen Bytes nicht zu viel. Wenn Sie Bit mit PHP verwenden, müssen Sie die ein- und ausgehenden Werte typisieren.
quelle
Bis MySQL einen Bit-Datentyp implementiert, erstellen Sie ein TINYINT-Feld, das
bit_flags
für alle Ihre booleschen Variablen aufgerufen wird, und maskieren und verschieben Sie das gewünschte boolesche Bit in Ihrem SQL , wenn Ihre Verarbeitung wirklich räumlich und / oder zeitlich unter Druck steht, z. B. bei Transaktionen mit hohem Volumen Abfrage.Wenn beispielsweise Ihr Bit ganz links Ihr Bool-Feld darstellt und die 7 Bits ganz rechts nichts darstellen, entspricht Ihr
bit_flags
Feld 128 (binär 10000000). Maskieren (verbergen) Sie die sieben Bits ganz rechts (mit dem bitweisen Operator&
) und verschieben Sie das 8. Bit sieben Leerzeichen nach rechts, bis 00000001. Jetzt ist die gesamte Zahl (in diesem Fall 1) Ihr Wert.Sie können solche Anweisungen beim Testen ausführen
usw.
Da Sie 8 Bits haben, haben Sie möglicherweise 8 boolesche Variablen aus einem Byte. Einige zukünftige Programmierer verwenden ausnahmslos die nächsten sieben Bits, daher müssen Sie maskieren. Verschieben Sie nicht einfach, sonst schaffen Sie in Zukunft die Hölle für sich und andere. Stellen Sie sicher, dass MySQL Ihre Maskierung und Verschiebung vornimmt - dies ist erheblich schneller als die Web-Skriptsprache (PHP, ASP usw.). Stellen Sie außerdem sicher, dass Sie einen Kommentar in das MySQL-Kommentarfeld für Ihr
bit_flags
Feld einfügen .Diese Websites sind bei der Implementierung dieser Methode hilfreich:
quelle
VARCHAR
und führen Sie die Demaskierungsprozedur im Code aus (Sie müssen ihn auch nicht auf 8 Felder beschränken). ...BIT
Typ existiert. Siehe dev.mysql.com/doc/refman/8.0/en/bit-type.htmlIch hatte es satt, Nullen, Nullen und '' genau um eine Schleife von PHP-, MySql- und POST-Werten zu runden, also benutze ich einfach 'Ja' und 'Nein'.
Dies funktioniert einwandfrei und erfordert keine spezielle Behandlung, die nicht offensichtlich und einfach durchzuführen ist.
quelle
Unter Bezugnahme auf diesen Link Boolescher Datentyp in MySQL ist je nach Anwendungsnutzung Bit (1) die bessere Wahl, wenn nur 0 oder 1 gespeichert werden sollen.
quelle
BIT(1)
nur einb'0'
oderb'1'
Wert gespeichert werden kann. Das größte Problem mit demBIT
Datentyp ist, dass verschiedene Client-Bibliotheken eine unterschiedliche Wonky-Behandlung des Datentyps haben. Überprüfen Sie das Verhalten in verschiedenen SQL-Tools (SQLyog, TOAD für MySQL, SQL Developer), Tools, die Datenbankmodelle "zurückentwickeln", und verschiedenen Clients wie JDBC, PHP, Perl DBI und testen Sie einige ORM-Frameworks ( Ruhezustand, Mybatis, JPA). In Bezug auf Benutzerfreundlichkeit, Tool- / Framework-Kompatibilität / native UnterstützungTINYINT(1)
ist der klare Gewinner.BIT
als auchTINYINT
. Siehe MyBatis JdbcType-Klasse, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…Da sowohl MySQL (8.0.16) als auch MariaDB (10.2.1) die CHECK-Einschränkung implementiert haben, würde ich jetzt verwenden
Sie werden nur zum Speichern der Lage sein
0
,1
oderNULL
, sowie Werte, die umgerechnet werden kann0
oder1
ohne Fehler wie'1'
,0x00
,b'1'
oderTRUE
/FALSE
.Wenn Sie keine NULL-Werte zulassen möchten, fügen Sie die
NOT NULL
Option hinzuBeachten Sie, dass es praktisch keinen Unterschied , wenn Sie verwenden
TINYINT
,TINYINT(1)
oderTINYINT(123)
.Wenn Sie möchten, dass Ihr Schema aufwärtskompatibel ist, können Sie auch
BOOL
oder verwendenBOOLEAN
db <> Geigen-Demo
quelle
ENUM
(es muss seinenum('0', '1')
- beachten Sie: das sind Zeichenfolgen) ist keine gute Idee. Es gibt zu viele Probleme aufgrund der internen Speicherung und der Behandlung von Nicht-String-Werten. Z.B.0
undFALSE
kann nicht gespeichert werden.1
undTRUE
werden'0'
. Und2
wird'1'
.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 ich werde es nie wieder verwenden. Es hat meine Entwicklung sehr erschwert, wenn ich vorbereitete Anweisungen, Bibliotheken usw. (php) verwendet habe.Seitdem benutze ich immer
tinyint(1)
, scheint gut genug.quelle
Sie können den Datentyp BOOL, BOOLEAN zum Speichern von Booleschen Werten verwenden.
Der Datentyp BIT (1) ist jedoch sinnvoller, um einen booleschen Wert (entweder true [1] oder false [0]) zu speichern. TINYINT (1) ist jedoch einfacher zu verarbeiten, wenn Sie Daten ausgeben, abfragen usw. ein und um Interoperabilität zwischen MySQL und anderen Datenbanken zu erreichen. Sie können diese Antwort oder diesen Thread auch überprüfen .
Lesen Sie weiter die Dokumentation
quelle