Boolean vs tinyint (1) für boolesche Werte in MySQL

124

Welcher Spaltentyp eignet sich am besten in einer MySQL-Datenbank für boolesche Werte? Ich benutze booleanaber mein Kollege benutzt tinyint(1).

Tom
quelle
3
Es scheint, dass MySQL transparent behandelt booleanals tinyint(1). Sie können also verwenden boolean, trueund falseMySQL behandelt sie als tinyint(1), 1und 0.
ADTC
Ein anderer Fall ist char 1 mit Y & N, der von manchen Leuten schneller sein soll.
Zon

Antworten:

153

Diese Datentypen sind Synonyme.

Māris Kiseļovs
quelle
6
Ich würde sagen , nicht die Datentypen sind Synonyme - tinyint (1) ist die gleiche wie Bool, aber Tinyint und Bool sind nicht das gleiche. Kleiner Punkt, aber Ihre Antwort hat mich beim ersten Lesen gestolpert
Kyle Chadha
2
Dies beantwortet die Frage nicht. Zwar ist tinyint (1) funktional identisch mit bool, doch das OP fragte, was am besten zu verwenden sei. Die Antwort von @dj_segfault erklärt ordnungsgemäß, warum Bool beim Speichern eines Booleschen Werts gegenüber tinyint (1) bevorzugt werden sollte.
Kyle Morgan
87

Ich werde hier einen anderen Ansatz verfolgen und vorschlagen, dass es für Ihre Mitentwickler genauso wichtig ist, Ihren Code zu verstehen wie für den Compiler / die Datenbank. Die Verwendung von Boolean kann das Gleiche tun wie die Verwendung von tinyint, hat jedoch den Vorteil, dass Sie semantisch vermitteln, was Ihre Absicht ist, und das ist etwas wert.

Wenn Sie einen tinyint verwenden, ist es nicht offensichtlich, dass die einzigen Werte, die Sie sehen sollten, 0 und 1 sind. Ein Boolescher Wert ist IMMER wahr oder falsch.

dj_segfault
quelle
35

booleanist kein eindeutiger Datentyp in MySQL; Es ist nur ein Synonym für tinyint. Siehe diese Seite im MySQL-Handbuch .

Persönlich würde ich vorschlagen, tinyint als Präferenz zu verwenden, da Boolean nicht das tut, was Sie denken, dass es aus dem Namen hervorgeht, was zu möglicherweise irreführendem Code führt. Aber auf praktischer Ebene spielt es wirklich keine Rolle - beide tun dasselbe, sodass Sie durch die Verwendung von beiden nichts gewinnen oder verlieren.

Spudley
quelle
8

Verwenden Sie enum, es ist das einfachste und schnellste

Ich werde enum oder tinyint (1) nicht empfehlen, da Bit (1) nur 1 Bit zum Speichern des Booleschen Werts benötigt, während tinyint (1) 8 Bit benötigt.

ref

TINYINT vs ENUM (0, 1) für boolesche Werte in MySQL

Pramendra Gupta
quelle
Wir können enum nicht verwenden, da unsere Datenbank auch sqlite unterstützen muss
Tom
11
Wenn Sie InnoDB verwenden, benötigt Bit genauso viel Speicherplatz wie tinyint. Von High Performance MySQL (die Percona-Leute) "InnoDB speichert jede [Bit] -Spalte als kleinsten Integer-Typ, der groß genug ist, um die Bits aufzunehmen, sodass Sie keinen Speicherplatz sparen." Der einzige Vorteil besteht darin, dass Sie mehrere boolesche Werte in einer BIT-Spalte (morethan1) speichern. Wenn Sie also nur ein boolesches Feld haben, entspricht die Verwendung von tinyint dem Bit in InnoDB und ist vorzuziehen, da mit tinyint normalerweise einfacher zu arbeiten ist.
Billmalarky
Nicht wahr für MySQL: BIT(M) - approximately (M+7)/8 bytessiehe: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

Es stimmt zwar, dass boolund tinyint(1)sind funktional identisch sind , boolsollte die bevorzugte Option sein , da sie die semantische Bedeutung trägt , was Sie zu tun versuchen. Außerdem werden viele ORMs boolin den nativen booleschen Typ Ihrer Programmiersprache konvertiert .

Kyle Morgan
quelle
0

Meine Erfahrung bei der Verwendung von Dapper zur Verbindung mit MySQL ist, dass es wichtig ist . Ich habe ein nicht nullbares Bit (1) mit dem folgenden Skript in ein nullbares tinyint (1) geändert:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Dann fing Dapper an, Ausnahmen zu werfen. Ich habe versucht, den Unterschied vor und nach dem Skript zu untersuchen. Und bemerkte, dass sich das Bit (1) in tinyint (1) geändert hatte.

Ich rannte dann:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Welches löste das Problem.

smerlung
quelle