我无法理解为什么这个选项。 签名的TINYINT数据类型可以存储介于-128和127之间的整数值。
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
答案 0 :(得分:2)
数据方面,tinyint(1)
,tinyint(2)
,tinyint(3)
等都完全相同。对于SIGNED
,它们都在-128到127之间,对于UNSIGNED
,它们都在0-255之间。正如其他答案所指出的那样,括号中的数字仅仅是显示宽度提示。
但是,您可能需要注意,应用程序=明智的东西可能看起来不同。在这里,tinyint(1)
可以具有特殊含义。例如,Connector / J(Java连接器)将tinyint(1)
视为布尔值,而不是将数值结果返回给应用程序,而是将值转换为true
和false
。这可以通过tinyInt1isBit=false
连接参数进行更改。
tinyint(1)可以保存-128到127范围内的数字,因为数据类型是8位(1字节) - 显然无符号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客户端不使用它。
<强> 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) - what is the difference? 强>
答案 1 :(得分:1)
数值数据类型的长度参数仅影响显示宽度,但不影响可存储的值。
TINYINT -128 to 127 (or 0-255 unsigned)
SMALLINT -32768 to 32767 (or 0-65535 unsigned)
MEDIUMINT -8388608 to 8388607 (or 0-16777215 unsigned)
INT -2147483648 to 2147483647 (or 0-4294967295 unsigned)
BIGINT -9223372036854775808 to 9223372036854775807 (or 0-18446744073709551615 unsigned)