sql >> Database teknologi >  >> Database Tools >> phpMyAdmin

Hvorfor fungerer TINYINT(1) som en boolesk, men INT(1) ikke?

(1) i parentes for en MySQL-heltalstype har intet at gøre med rækken af ​​værdier, der accepteres af datatypen, eller hvordan den er gemt. Det er kun til visning.

Se også mit svar på Indtastning MySQL:BigInt(20) vs Int(20) osv. .

TINYINT er ikke forskellig fra TINYINT(1) eller TINYINT(2) eller TINYINT(64). Det er en 8-bit heltalsdatatype med fortegn, og den accepterer enhver 8-bit heltalsværdi fra -128 til 127.

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

mysql> insert into b values (42);

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

For nemheds skyld understøtter MySQL et alias for BOOL, som straks erstattes af TINYINT(1).

mysql> create table b2 (i bool);

mysql> show create table b2;

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

Som jeg sagde, betyder brugen af ​​(1) næsten ingenting, det er kun en konvention, så hvis du ser TINYINT(1), er det rimeligt at antage, at kolonnen er tilsigtet skal bruges som boolean. Men intet i MySQL forhindrer dig i at gemme andre heltalsværdier i den.

Hvis du ønsker, at en kolonne kun skal acceptere 0 eller 1, kan du bruge BIT(1):

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

Dette sparer dog ikke plads sammenlignet med TINYINT, fordi lageret for en given kolonne rundes op til den nærmeste byte.

PS:På trods af svar fra @samdy1 gemmer TINYINT ikke strenge '0' eller '1' i det hele taget gemmer den heltal 0 eller 1 , såvel som andre heltal fra -128 til 127. Der er ingen grund til at citere heltal i SQL, og jeg undrer mig ofte over, hvorfor så mange udviklere gør det.



  1. Kode til at begrænse brugerregistrering - skjul/vis formular php

  2. Sådan aktiverer du relationsvisning i phpmyadmin

  3. hvordan indtastes værdier i rowguid-kolonnen?

  4. Sådan listes DISTINCER ALLE produkter fra databasen