MySql:Tinyint(2)与tinyint(1)有什么区别?

263

我知道mysql中的布尔值是用tinyint(1)表示的。

今天我看到一个表格定义了一个像tinyint(2)这样的整数,还有其他的像int(4)int(6)之类的。

在整数和tinyint类型的字段中,大小指的是什么?


4
在这里阅读有关MySQL整数数据类型的内容。链接:http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html#integer-types。 - Bud Damyanov
2
@AamirR的答案是正确的。 - evilReiko
1
@evilReiko,zerofill 对值的存储没有影响,它只是关于展示方式的问题...在我看来,空格或零对任何人答案的正确性并没有真正的影响。 - Ja͢ck
这个回答解决了你的问题吗?mysql中的INT(5)是什么意思? - Nico Haase
4个回答

278

(m)表示列显示宽度;例如,MySQL客户端等应用程序在显示查询结果时会使用此功能。

例如:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

这里的abc分别使用TINYINT(1)TINYINT(2)TINYINT(3)。可以看到,它在显示宽度的左侧填充值。

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


21
“列宽”是指表格中每一列的宽度。 - realtebo
10
@realtebo 这主要是mysql命令行客户端用于显示目的。 - Ja͢ck
3
界面显示的“数字”数量。换句话说,它会在左侧填充零。这种功能在数据库早期有些意义,但现在已经过时了。 - Denilson Sá Maia
2
@Kailas 如果你没有使用mysql客户端?那就完全没有了。 - Ja͢ck
14
不!tinyint(1)并不仅限于0-9的范围。它接受整个tinyint类型可以容纳的范围。 - Ja͢ck
显示剩余7条评论

166

这意味着显示宽度

无论您使用tinyint(1)还是tinyint(2),都没有任何区别。

我总是使用tinyint(1)和int(11),我使用过几个MySQL客户端(navicat,sequel pro)。

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

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

A tinyint(2) zerofill

B tinyint(4) zerofill

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

带有显示宽度的零填充


37
有趣的是,我刚刚发现在C#官方MySQL连接器中,tinyint(1)永远不会返回不同于0和1的值。这可能与tinyint(1)自动被识别为布尔类型有关。提醒一下,在有些情况下这很重要。 - Daniel Sharp
使用尽可能小的整数类型和长度不是更好吗?我认为这可以在MySQL中节省内存。 - nclsvh
正如@Daniel-Sharp所指出的那样,这似乎对连接器很重要。我刚刚遇到了一个Hibernate使用JDBC的问题,报告说它将TINYINT(1)解释为BIT。 - sfj
4
@DanielSharp 这可能是由于连接选项 tinyInt1isBit 的默认值为 true 导致的。详情请参阅 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html。 - Parisbre56
2
我一直以为这与接受的数字数量有关(例如,int(4)不允许超过9999)。那么我一直都想错了。在PHP和MySQL命令行中,我可以看到其上面的值没问题。 - Joshua Bakker
1
看看有多少人对此感到困惑,我以为只有我一个人。除了布尔值之外,我是否应该停止使用tinyint(1)来处理其他东西? - Carl Kroeger Ihl

20
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)

15
请修改您的答案以包含一些解释。仅限代码的答案对于教育未来的 SO 读者几乎没有帮助。您的答案正在等待审核,因为其质量较低。 - mickmackusa

19

1
“显示宽度”是什么意思? - realtebo
2
从参考资料中 - 例如,INT(4) 指定了一个显示宽度为四个数字的 INT。这个可选的显示宽度可以被应用程序用来显示宽度小于列指定宽度的整数值,通过在左侧填充空格实现。 - Devart
2
但是我没有看到使用这个特性的应用程序或MySQL客户端。我总是使用INT(11)并使用格式化函数来自定义输出。 - Devart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接