Was ist der Unterschied zwischen BIT und TINYINT in MySQL?

106

In welchen Fällen würden Sie welche verwenden? Gibt es einen großen Unterschied? Welche verwende ich normalerweise von Persistenz-Engines zum Speichern von Booleschen Werten?

Träger
quelle

Antworten:

122

Ein TINYINT ist ein 8-Bit-Ganzzahlwert, ein BIT-Feld kann zwischen 1 Bit BIT (1) und 64 Bit BIT (64) speichern. Für boolesche Werte ist BIT (1) ziemlich häufig.

Robert Gamble
quelle
10
Was ist der Unterschied zwischen einem TINYINT und einem BIT (8)?
Pacerier
16
TINYINT kann signiert oder nicht signiert sein und sich auf negative Zahlen beziehen. Bit speichert nur die Bits, ohne Daten zu signieren. Sie müssen das MSB selbst interpretieren.
definiert
4
Um Verwirrung zu vermeiden, sollte hinzugefügt werden, dass sich TINYINT und BIT (1) in ihren Speicheranforderungen nicht unterscheiden und dass BOOL und BOOLEAN Synonyme für TINYINT (1) Numeric Type Overview sind .
Timo Strotmann
59

Aus der Übersicht der numerischen Typen ;

BIT [(M)]

Ein Bitfeldtyp. M gibt die Anzahl der Bits pro Wert von 1 bis 64 an. Der Standardwert ist 1, wenn M weggelassen wird.

Dieser Datentyp wurde in MySQL 5.0.3 für MyISAM hinzugefügt und in 5.0.5 auf MEMORY, InnoDB, BDB und NDBCLUSTER erweitert. Vor 5.0.3 ist BIT ein Synonym für TINYINT (1).

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

Eine sehr kleine ganze Zahl. Der vorzeichenbehaftete Bereich liegt zwischen -128 und 127. Der vorzeichenlose Bereich liegt zwischen 0 und 255.

Berücksichtigen Sie dies zusätzlich.

BOOL, BOOLEAN

Diese Typen sind Synonyme für TINYINT (1). Ein Wert von Null wird als falsch betrachtet. Werte ungleich Null werden als wahr angesehen.

Nelson Miranda
quelle
12
Sie sagen, dass booleanein Byte benötigt wird, obwohl es wirklich nur ein bisschen ist, also ist ein BIT (1) nach v5.0.3 besser?
Pacerier
3
Ja @Pacerier. Boolean ist einfach ein hässlicher Alias ​​für ein Zahlenfeld.
Áxel Costas Pena
7
In Bezug auf den tatsächlichen Speicher belegt BIT (1) immer noch mindestens ein Byte. BIT (M) = (M + 7) / 8 Bytes. (1 + 7) / 8 = 1 Byte. Siehe Speicheranforderungen für numerische Typen .
Drazen Bjelovuk
1
Traurig, dass BOOL/ BOOLEANsind Aliase für TINYINT(1)statt BIT. Sicher, sie alle belegen am Ende ein ganzes Byte, aber semantisch BITwäre das viel angemessener.
MestreLion
38

Alle diese theoretischen Diskussionen sind großartig, aber in der Realität ist es zumindest, wenn Sie MySQL und wirklich auch für SQLServer verwenden, am besten, nicht-binäre Daten für Ihre Booleschen Werte beizubehalten, aus dem einfachen Grund, dass es einfacher ist, mit ihnen zu arbeiten geben die Daten aus, fragen ab und so weiter. Dies ist besonders wichtig, wenn Sie versuchen, eine Interoperabilität zwischen MySQL und SQLServer zu erreichen (dh Sie synchronisieren Daten zwischen beiden), da die Behandlung des BIT-Datentyps in beiden Fällen unterschiedlich ist. In der Praxis werden Sie also viel weniger Probleme haben, wenn Sie sich an einen numerischen Datentyp halten. Ich würde MySQL empfehlen, bei BOOL oder BOOLEAN zu bleiben, die als TINYINT (1) gespeichert werden. Selbst die Art und Weise, wie MySQL Workbench und MySQL Administrator den BIT-Datentyp anzeigen, ist nicht gut (es ist ein kleines Symbol für Binärdaten).

Sheldmandu
quelle
1
Meiner Meinung nach ist es nicht meine Schuld, dass einige Schnittstellen usw. die korrekten Binärdaten falsch interpretieren. Wenn sich ein Administrator (einschließlich ich) über ein Symbol beschwert (in Bezug auf MySQL Wrokbench), ist dies die Schuld desjenigen, der meine korrekten (binären) Daten als Symbol falsch interpretiert hat, das keine Informationen über den Inhalt enthält. Also hat MySQL / Oracle den Fehler gemacht und ich bin nicht bereit, mein Programmierkonzept zu ändern, nur weil jemand einen Fehler gemacht hat.
Matmarbon
11

BIT sollte nur 0 und 1 zulassen (und NULL, wenn das Feld nicht als NOT NULL definiert ist). TINYINT (1) erlaubt jeden Wert, der in einem einzelnen Byte gespeichert werden kann, -128..127 oder 0..255, je nachdem, ob es nicht signiert ist oder nicht (die 1 zeigt, dass Sie nur eine einzelne Ziffer verwenden möchten, dies jedoch tut nicht daran hindern, einen größeren Wert zu speichern).

Bei Versionen älter als 5.0.3 wird BIT als TINYINT (1) interpretiert, daher gibt es dort keinen Unterschied.

BIT hat die Semantik "Dies ist ein Boolescher Wert", und einige Apps betrachten TINYINT (1) auf dieselbe Weise (aufgrund der Art und Weise, wie MySQL es behandelt), sodass Apps die Spalte möglicherweise als Kontrollkästchen formatieren, wenn sie den Typ aktivieren und entscheiden Sie sich für ein darauf basierendes Format.

Michael Madsen
quelle
4

Könnte falsch sein, aber:

Tinyint ist eine ganze Zahl zwischen 0 und 255

Bit ist entweder 1 oder 0

Daher ist für mich Bit die Wahl für Boolesche

Allen Hardy
quelle
Tut mir leid, ich dachte, wir wären hier auf T_SQL, also weiß ich es nicht
Allen Hardy
0

Aus meiner Erfahrung sage ich Ihnen, dass BIT Probleme mit Linux-Betriebssystemtypen hat (z. B. Ubuntu). Ich habe meine Datenbank unter Windows entwickelt und nachdem ich alles unter Linux bereitgestellt hatte, hatte ich Probleme mit Abfragen, die Tabellen mit BIT DATA TYPE eingefügt oder ausgewählt haben.

Bit ist vorerst nicht sicher. Ich wechselte zu tinyint (1) und arbeitete perfekt. Ich meine, Sie brauchen nur einen Wert, um zu unterscheiden, ob es 1 oder 0 ist, und tinyint (1) ist dafür in Ordnung

AndreiTiberiu
quelle