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

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
)

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.


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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.