tinyint(N)是什么意思?


17

据我所知,当我们使用带有数字数据类型的参数长度时,它指定了显示宽度。
我尝试了以下方法:

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)  

首先,tinyint是一个1字节的值。那是什么意思tinyint(4)呢?不能为4位数字。

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)  

我看到在tinyint中我存储了10和101,尽管将其定义为tinyint(1),但我可以取回这些值。
我不应该看到1 var1吗?即只有1个显示数字?


为什么一次插入后有两行?我无法完全理解此代码。
WoodrowShigeru

Answers:


24

数据明智的,tinyint(1)tinyint(2)tinyint(3)等都是完全一样的。它们的范围均为-128至127 SIGNED或0-255 UNSIGNED。正如其他答案所指出的那样,括号中的数字仅是显示宽度的提示。

但是,您可能要注意,应用程序=明智的事物看起来可能有所不同。在这里,tinyint(1)可以采取特殊的含义。例如,Connector / J(Java连接器)将其tinyint(1)视为布尔值,并且不将数值结果返回给应用程序,而是将值转换为truefalse。可以通过tinyInt1isBit=false连接参数进行更改。


13

由于数据类型为8位(1个字节),tinyint(1)可以保存-128至127范围内的数字-显然,无符号的tinyint可以保存值0-255。

它会自动截断超出范围的值:

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>

...除非您更改sql_mode或更改服务器配置:

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>

您怀疑,DDL中用于数据类型的值(例如:tinyint(1))是显示宽度。但是,它是可选的,客户端不必使用它。例如,标准的MySQL客户端不使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.