sql >> Databasteknik >  >> Database Tools >> phpMyAdmin

Varför fungerar TINYINT(1) som ett booleskt men inte INT(1)?

(1) inom parentes för en MySQL-heltalstyp har ingenting att göra med intervallet av värden som accepteras av datatypen, eller hur den lagras. Det är bara för visning.

Se även mitt svar på att skriver in MySQL:BigInt(20) vs Int(20) etc .

TINYINT skiljer sig inte från TINYINT(1) eller TINYINT(2) eller TINYINT(64). Det är en 8-bitars signerad heltalsdatatyp och den accepterar alla 8-bitars heltalsvärden från -128 till 127.

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

mysql> insert into b values (42);

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

För enkelhetens skull stöder MySQL ett alias för BOOL, som omedelbart ersätts av 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 jag sa, användningen av (1) betyder nästan ingenting, det är bara en konvention så att om du ser TINYINT(1) är det rimligt att anta att kolumnen är avsedd att användas som en boolean. Men ingenting i MySQL hindrar dig från att lagra andra heltalsvärden i den.

Om du vill att en kolumn ska acceptera endast 0 eller 1, du kan använda 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

Detta sparar dock inget utrymme jämfört med TINYINT, eftersom lagringen för en given kolumn avrundas uppåt till närmaste byte.

PS:Trots svar från @samdy1 lagrar inte TINYINT strängar '0' eller '1' överhuvudtaget lagrar den heltal 0 eller 1 , såväl som andra heltal från -128 till 127. Det finns inget behov av att citera heltal i SQL, och jag blir ofta förbryllad varför så många utvecklare gör det.



  1. DATETIME och TIMESTAMP Längd/Värdefel

  2. SQL-fråga:Hitta max 2 av 3 nummer och lagra det i en annan kolumn

  3. php-formulärinlämning till mysql-databasen

  4. Enkelt sätt att konvertera exec sp_executesql till en normal fråga?