Datamässigt, tinyint(1)
, tinyint(2)
, tinyint(3)
etc. är alla exakt likadana. De är alla i intervallet -128 till 127 för SIGNED
eller 0-255 för UNSIGNED
. Som andra svar noterade är siffran inom parentes bara ett tips om visningsbredd.
Du kanske vill notera att applikationsmässigt saker kan se annorlunda ut. Här, tinyint(1)
kan få en speciell betydelse. Till exempel behandlar Connector/J (Java-anslutningen) tinyint(1)
som ett booleskt värde, och istället för att returnera ett numeriskt resultat till applikationen konverterar den värden till true
och false
. detta kan ändras via tinyInt1isBit=false
anslutningsparameter.
En tinyint(1) kan hålla siffror i intervallet -128 till 127, på grund av att datatypen är 8 bitar (1 byte) - uppenbarligen kan en osignerad tinyint hålla värden 0-255.
Det kommer tyst att trunkera värden utanför intervallet:
mysql> create table a
-> (
-> ttt tinyint(1)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from a;
+------+
| ttt |
+------+
| 127 |
| -128 |
| 127 |
| -128 |
+------+
4 rows in set (0.00 sec)
mysql>
... om du inte ändrar sql_mode
eller ändra serverkonfigurationen:
mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>
Värdet som används i DDL för datatypen (t.ex.:tinyint(1)) är, som du misstänkte, visningsbredden. Det är dock valfritt och kunderna behöver inte använda det. Standard MySQL-klienten använder det till exempel inte.
https://dev.mysql .com/doc/refman/5.1/en/integer-types.html
https://dev .mysql.com/doc/refman/5.0/en/numeric-type-overview.html
MySql:Tinyint (2) ) vs tinyint(1) - vad är skillnaden?