Was bedeutet tinyint (N)?

17

Wenn wir eine Argumentlänge mit numerischen Datentypen verwenden, gibt dies meines Wissens die Anzeigebreite an.
Ich habe folgendes versucht:

mysql> create table boolean_test (var1 boolean, var2 tinyint);    
Query OK, 0 rows affected (0.10 sec)   

mysql> show create table boolean_test;   
+--------------+-------------------------   
| Table        | Create Table
+--------------+-------------------------  
| boolean_test | CREATE TABLE `boolean_test` (  
  `var1` tinyint(1) DEFAULT NULL,  
  `var2` tinyint(4) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |   
+--------------+---------------------------  
1 row in set (0.00 sec)  

Erstens ist tinyint ein 1-Byte-Wert. Also, was ist die Bedeutung von tinyint(4)? Es können keine 4 Ziffern eingegeben werden.

mysql> insert into boolean_test values(101,112);  
Query OK, 1 row affected (0.03 sec)   

mysql> select * from boolean_test;  
+------+------+  
| var1 | var2 |  
+------+------+  
|   10 |  112 |  
|  101 |  112 |  
+------+------+  
2 rows in set (0.00 sec)  

Ich sehe, dass ich in tinyint eine 10 und eine 101 gespeichert habe und diese Werte zurückbekommen konnte, obwohl sie als tinyint (1) definiert sind.
Sollte ich nicht eine 1 für sehen var1? Dh nur 1 Anzeigestellen?

Cratylus
quelle
Warum haben Sie zwei Zeilen nach einer Einfügung? Ich kann diesen Code nicht vollständig verstehen.
WoodrowShigeru

Antworten:

24

Daten-weise, tinyint(1), tinyint(2), tinyint(3)etc. sind alle genau gleich. Sie liegen alle im Bereich von -128 bis 127 für SIGNEDoder 0-255 für UNSIGNED. Wie andere Antworten angemerkt haben, ist die Zahl in Klammern lediglich ein Hinweis auf die Anzeigebreite.

Sie sollten jedoch beachten, dass anwendungsbezogene Dinge möglicherweise anders aussehen. Hier tinyint(1)kann eine besondere Bedeutung zukommen. Beispielsweise wird der Connector / J (Java-Connector) tinyint(1)als boolescher Wert behandelt und konvertiert Werte in trueund , anstatt ein numerisches Ergebnis an die Anwendung zurückzugeben false. Dies kann über den tinyInt1isBit=falseVerbindungsparameter geändert werden.

Shlomi Noach
quelle
13

Eine tinyint (1) kann Zahlen im Bereich von -128 bis 127 enthalten, da der Datentyp 8 Bit (1 Byte) beträgt - offensichtlich kann eine tinyint ohne Vorzeichen Werte von 0 bis 255 enthalten.

Außerhalb des Bereichs liegende Werte werden stillschweigend abgeschnitten:

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>

... es sei denn, Sie ändern die sql_modeoder ändern die Serverkonfiguration:

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>

Der in der DDL für den Datentyp verwendete Wert (z. B. tinyint (1)) ist, wie Sie vermutet haben, die Anzeigebreite. Es ist jedoch optional und die Clients müssen es nicht verwenden. Der Standard-MySQL-Client verwendet es beispielsweise nicht.

Philᵀᴹ
quelle