MySql:Tinyint(2)和Tinyint(1)-有什么区别?

MySql:Tinyint(2)和Tinyint(1)-有什么区别?,mysql,sqldatatypes,Mysql,Sqldatatypes,我知道mysql中的布尔值是tinyint(1) 今天我看到一个定义了整数的表,比如tinyint(2),还有其他的表,比如int(4),int(6) 整型和tinyint型字段中的大小是什么意思?关于INT,tinyint。。。这些是不同的数据类型,INT是4字节的数字,TINYINT是1字节的数字。更多信息请点击这里- TINYINT数据类型的语法是TINYINT(M),其中M表示最大显示宽度(仅在MySQL客户端支持时使用) .(m)表示列显示宽度;诸如MySQL客户机之类的应用程序在显示

我知道mysql中的布尔值是
tinyint(1)

今天我看到一个定义了整数的表,比如
tinyint(2)
,还有其他的表,比如
int(4)
int(6)


整型和tinyint型字段中的大小是什么意思?

关于INT,tinyint。。。这些是不同的数据类型,INT是4字节的数字,TINYINT是1字节的数字。更多信息请点击这里-

TINYINT数据类型的语法是TINYINT(M),其中M表示最大显示宽度(仅在MySQL客户端支持时使用)

.

(m)
表示列显示宽度;诸如MySQL客户机之类的应用程序在显示查询结果时利用了这一点

例如:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |
这里
a
b
c
分别使用
TINYINT(1)
TINYINT(2)
TINYINT(3)
。如您所见,它使用显示宽度在左侧填充值


需要注意的是,它不会影响该特定类型的可接受值范围,即
TINYINT(1)
仍然接受
[-128..127]
它意味着显示宽度

mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)
无论您使用tinyint(1)还是tinyint(2),都没有任何区别

我总是使用tinyint(1)和int(11),我使用了几个mysql客户端(navicat、sequel pro)

这根本没有任何意义!我运行了一个测试,上面所有的客户端甚至命令行客户端似乎都忽略了这一点

但是,如果您使用的是
ZEROFILL
选项,则显示宽度是最重要的,例如,您的表有以下两列:

Atinyint(2)零填充

Btinyint(4)零填充

两列的值均为1,列A的输出为
01
,列B的输出为
0001
,如下面的屏幕截图所示:)


阅读MySQL整数数据类型。@AamirR的答案是正确的one@evilReikozerofill对值的存储方式也没有影响,它实际上是关于表示的。。。空格或零对任何人的答案的正确性都没有影响。“显示宽度”是什么意思!?例如,从参考中,INT(4)指定一个显示宽度为四位数的INT。这个可选的显示宽度可以被应用程序用来显示宽度小于为列指定的宽度的整数值,方法是用空格填充它们。但是我还没有看到应用程序或MySQL客户端使用这个功能。我总是使用INT(11)和格式化函数来定制输出。什么是“列宽”?@realtebo它主要由mysql命令行客户端用于显示目的。界面显示的“位数”。换句话说,它将在左侧填充零。这种功能在早期的数据库中有一定的意义,但现在它只是一种遗留功能。@Kailas如果您不使用mysql客户端?一点也没有。@Kailas不!tinyint(1)只接受0-9。它接受tinyint所能容纳的全部范围。请编辑您的答案以包含一些解释。只有代码的答案对教育未来的读者几乎没有什么作用。你的答案因为质量低而被列入了审核队列。奇怪的是,我刚刚发现,在C#官方MySQL连接器tinyint(1)中,从未返回与0和1不同的值。这可能与tinyint(1)自动被识别为布尔值有关。只是一个提示有时很重要。使用尽可能小的整数类型和长度不是更好吗?我当时的印象是,这在MySQL中节省了内存。正如@Daniel Sharp指出的,这似乎对连接器很重要。刚才Hibernate使用JDBC报告时出现问题,它将TINYINT(1)解释为BIT。@DanielSharp这可能是由于默认为true的连接选项tinyInt1isBit造成的。我一直认为这与接受的数字量有关(例如,int(4)不允许任何高于9999的数字)。我想我当时总是想错了。在PHP和MySQL命令行中,我都可以看到上面的值。