phpMyAdmin
 sql >> Datenbank >  >> Database Tools >> phpMyAdmin

Warum funktioniert TINYINT(1) als boolescher Wert, INT(1) jedoch nicht?

Die (1) in Klammern für einen ganzzahligen MySQL-Typ hat nichts mit dem Wertebereich zu tun, der vom Datentyp akzeptiert wird, oder wie er gespeichert wird. Es dient nur zur Anzeige.

Siehe auch meine Antwort auf Types in MySQL:BigInt(20) vs. Int(20) usw. .

TINYINT unterscheidet sich nicht von TINYINT(1) oder TINYINT(2) oder TINYINT(64). Es ist ein 8-Bit-Integer-Datentyp mit Vorzeichen und akzeptiert jeden 8-Bit-Integerwert von -128 bis 127.

mysql> create table b (i tinyint(1));

mysql> insert into b values (42);

mysql> select * from b;
+------+
| i    |
+------+
|   42 |
+------+

Der Einfachheit halber unterstützt MySQL einen Alias ​​für BOOL, der sofort durch TINYINT(1) ersetzt wird.

mysql> create table b2 (i bool);

mysql> show create table b2;

CREATE TABLE `b2` (
  `i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Wie gesagt, die Verwendung von (1) bedeutet fast nichts, es ist nur eine Konvention, sodass es vernünftig ist anzunehmen, dass die Spalte beabsichtigt ist, wenn Sie TINYINT(1) sehen als boolescher Wert verwendet werden. Aber nichts in MySQL hindert Sie daran, andere Integer-Werte darin zu speichern.

Wenn Sie möchten, dass eine Spalte nur akzeptiert 0 oder 1, Sie können BIT(1) verwenden:

mysql> create table b3 (i bit(1));

mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1

mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1

Dies spart jedoch keinen Platz im Vergleich zu TINYINT, da der Speicherplatz für eine bestimmte Spalte auf das nächste Byte aufgerundet wird.

PS:Trotz Antwort von @samdy1 speichert TINYINT keine Strings '0' oder '1' überhaupt speichert es Ganzzahlen 0 oder 1 , sowie andere Ganzzahlen von -128 bis 127. In SQL müssen Ganzzahlen nicht in Anführungszeichen gesetzt werden, und ich wundere mich oft, warum so viele Entwickler dies tun.