BOOLEAN oder TINYINT Verwirrung

90

Ich habe eine Datenbank für eine Site entworfen, bei der ich einen booleschen Datentyp verwenden muss, um nur zwei Zustände zu speichern, true oder false. Ich benutze MySQL.
Beim Entwerfen der Datenbank mit phpMyAdmin stellte ich fest, dass ich sowohl den BOOLEAN-Datentyp als auch den TINYINT-Datentyp habe.
Ich habe verschiedene Artikel durchgesehen, einige sagten, TINYINT sei dasselbe wie BOOLEAN, kein Unterschied. Einige sagen, BOOLEAN sei in MySQL in TINYINT konvertiert.

Meine Frage ist, wenn beide gleich sind, warum gibt es zwei? Es sollte nur einen von ihnen geben.

Hier ist der Verweis auf die Artikel, die ich gelesen habe:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Bipin Chandra Tripathi
quelle

Antworten:

135

MySQL hat keinen internen booleschen Datentyp. Es wird der kleinste ganzzahlige Datentyp verwendet - TINYINT.

BOOLEAN und BOOL sind Äquivalente von TINYINT (1), da sie Synonyme sind.

Versuchen Sie diese Tabelle zu erstellen -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Führen Sie dann SHOW CREATE TABLE aus. Sie erhalten diese Ausgabe -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
Devart
quelle
1
Aber Ihre Antwort ist in allen anderen Aspekten richtig. Was das OP zu verwirren scheint, ist die Existenz von Synonymen.
Ypercubeᵀᴹ
2
Es scheint, dass dies aus Gründen der Abwärtskompatibilität erfolgt. Der BOOLEAN-Datentyp war vor dem MySQL 5 und der nicht optimierte BIT-Typ war auch TINYINT. Aus der Dokumentation - Neue Funktionen für 5.1 geplant: Optimieren Sie den BIT-Typ auf ein Bit. (BIT benötigt jetzt ein Byte; es wird als Synonym für TINYINT behandelt.)
Devart
5
Ja, Sie können wissen, BIT(1)oder BIT(17)oder sogarBIT(64)
ypercubeᵀᴹ
3
@ Devart - Wenn Ihre Antwort die meisten Stimmen hat und zuerst erscheint (in meiner Liste sowieso) und einige Zeit vergangen ist, besteht die Möglichkeit, dass Sie bereit sind, Ihrer Antwort eine Diskussion über den BIT-Typ in MySQL 5.1 und hinzuzufügen später?
Jonathan
3
@Jonathan Vielleicht ist es wertvoll, es zu erwähnen, aber BIT (1) benötigt nicht weniger Speicherplatz als TINYINT (1) und wird nicht so angezeigt, wie es die meisten Leute bei Verwendung der Standard-MySQL-Konsole erwarten würden. Aufgrund dieses Nachteils und ohne Speichervorteile scheint die Verwendung von TINYINT (1) oder BOOLEAN meiner Erfahrung nach die häufigste zu sein.
Tyler Smith
31

Nur ein Hinweis für PHP-Entwickler (mir fehlen die notwendigen Stackoverflow-Punkte, um dies als Kommentar zu veröffentlichen) ... Die automatische (und stille) Konvertierung in TINYINT bedeutet, dass PHP einen Wert aus einer "BOOLEAN" -Spalte als "0" oder "0" abruft "1", nicht das erwartete (von mir) wahr / falsch.

Ein Entwickler, der sich das zum Erstellen einer Tabelle verwendete SQL ansieht und Folgendes sieht: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE", kann vernünftigerweise erwarten, dass beim Abrufen einer Zeile mit dieser Spalte True / False-Ergebnisse angezeigt werden. Stattdessen (zumindest in meiner Version von PHP) ist das Ergebnis "0" oder "1" (ja, eine Zeichenfolge "0" oder eine Zeichenfolge "1", keine int 0/1, danke php).

Es ist ein Trottel, aber genug, um Unit-Tests zum Scheitern zu bringen.

Tom Stambaugh
quelle
2
Als zusätzlichen Hinweis ziehen die MySQL-Treiber von PHP alle Ganzzahltypen als Zeichenfolgen ein.
Kojow7
24

Die neuesten MySQL-Versionen haben den neuen BITDatentyp, in dem Sie die Anzahl der Bits im Feld angeben können, die beispielsweise BIT(1)als BooleanTyp verwendet werden sollen, da dies nur 0oder sein kann 1.

Please_Dont_Bully_Me_SO_Lords
quelle
7

Ab MySQL 5.1 Version Referenz

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

================================================== =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/de/storage-requirements.html#data-types-storage-reqs-numeric

Vermögen
quelle
1
Ihre Referenz besagt, dass der erforderliche Speicher tatsächlich "ungefähr (M + 7) / 8 Bytes" beträgt. dh es wird auf das nächste volle Byte aufgerundet. Somit dauert es nicht 1 Bit.
Mpen