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


183

我在mysql中知道boolean为tinyint (1)

今天,我看到这样定义一个整数表tinyint(2),也喜欢其他人int(4)int(6)...

size在integer和tinyint类型的字段中意味着什么?


4
在此处阅读有关MySQL Integer数据类型的信息
巴德·达米扬诺夫

2
@AamirR的答案是正确的
evilReiko

1
@evilReiko ZEROFILL也没有做出差异值是如何存储,它的的确确是演示...空格或零并不真正使任何人的答案的正确性的差异IMO
杰克

Answers:


94

表示显示宽度

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

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

一点也不意味着!我进行了测试,所有上述客户端甚至命令行客户端似乎都忽略了这一点。

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

TINYINT(2)ZEROFILL

B tinyint(4)零填充

两列具有1的值,对于列输出将是010001用于,如在下面的截图:)

用displaywidth填充零


20
奇怪的是,我刚刚发现在C#官方MySQL连接器中,tinyint(1)永远不会返回不同于0和1的值。这可能与tinyint(1)自动被识别为布尔值有关。仅仅提防有时很重要。
丹尼尔·夏普

使用尽可能小的整数类型和长度不是更好吗?我印象中这可以节省MySQL的内存。
nclsvh

正如@ Daniel-Sharp指出的那样,它似乎对连接器很重要。Hibernate在使用JDBC报告时遇到了一个问题,它将TINYINT(1)解释为BIT。
sfj

2
@DanielSharp,可能是由于默认为true的连接选项tinyInt1isBit所致。见dev.mysql.com/doc/connector-j/8.0/en/...
Parisbre56

1
我一直认为这与接受的数字量有关(例如,int(4)不允许大于9999的数字)。猜猜我那时总是想错了。在PHP和MySQL命令行中,我都可以看到上面的值。
约书亚·巴克

226

(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]


16
“列宽”是什么意思?
realtebo,2012年

8
@realtebo它主要由mysql命令行客户端用于显示。
杰克

3
界面显示的“位数”数。换句话说,它将在左侧填充零。在数据库的早期,这种功能是有道理的,但是现在它只是遗留的。
2014年

2
@Kailas如果您不使用mysql客户端?一个都没有。
2014年

11
@Kailas不!tinyint(1)仅接受0-9。它接受tinyint可以容纳的全部范围。
2014年

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

11
请修改您的答案以包含一些说明。仅代码的答案对教育未来的SO读者几乎没有作用。您的回答在质量不高的审核队列中。
mickmackusa

14

关于INT,TINYINT ...这些是不同的数据类型,INT是4字节数字,TINYINT是1字节数字。此处的更多信息-INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT

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

数值类型属性


1
“显示宽度”是什么意思!
realtebo,2012年

2
根据引用-例如,INT(4)指定显示宽度为四位数的INT。应用程序可以使用此可选的显示宽度来显示整数值,该整数值的宽度小于为列指定的宽度,方法是用空格左键填充它们。
Devart 2012年

2
但是我还没有看到使用此功能的应用程序或MySQL客户端。我总是使用INT(11)并使用格式化功能来自定义输出。
Devart
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.