int(11)在MySQL中意味着什么?

int(11)在MySQL中意味着什么?

关于int(11)在MySQL中的含义,一个非常常见的误解是,该列可以存储长度为11位的最大整数值。然而,事实并非如此。Int(11)不决定列可以存储的最大值。11是整型列的显示宽度,与字符列不同,其中数字表示可以存储的字符数。

括号中的数字不决定可以存储在整型字段中的最大值和最小值。可以存储的最大值和最小值总是固定的。下表显示了每种整数类型所需的存储空间和范围

TypeStorage (Bytes)Minimum Value SignedMinimum Value UnsignedMaximum Value SignedMaximum Value Unsigned
TINYINT1-1280127255
SMALLINT2-3276803276765535
MEDIUMINT3-83886080838860716777215
INT4-2147483648021474836474294967295
BIGINT8-2630263-1264-1

Source: Integer Types (Exact Value) – INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT

那么他是什么?

对于整数类型的列,括号中的数字称为字段的显示宽度。这与其他类型字段的含义不同。对于浮点类型,它是总位数。对于字符字段,它是可以存储的最大字符数,例如VARCHAR(20)可以存储20个字符。

列的显示宽度不会影响该列中可以存储的最大值。具有 INT(5) 或 INT(11) 的列可以存储相同的最大值。另外,如果您有一列 INT(20),这并不意味着您将能够存储 20 位数字值(BIGINT 值)。该列仍将仅存储直到 INT 的最大值。

默认情况下,每种整数类型的数量与该类型的最大负值中的字符数相同。整数的最大负值是 -2147483648,它是 11 个字符,因此默认显示宽度是 11。同样,对于 BIGINT,默认显示宽度是 20,它等于最大负 BIGINT 中的字符数 (-9223372036854775808)。

它有什么用?

整数类型列的显示宽度实际上不会执行任何操作,除非该列是 UNSIGNED ZEROFILL。在这种情况下,如果要存储的数字少于 11 个字符(对于 INT(11)),则这些数字将在左侧补零。ZEROFILL 隐式使列无符号,因此它不能存储负数,因此 ZEROFILL 列中没有负数。

下面是显示值如何影响 UNSIGNED ZEROFILL 列的示例。

CREATE TABLE zerofill_demo (
	id INT(11) NOT NULL AUTO_INCREMENT,
	a INT(11) NOT NULL,
	b INT(11) UNSIGNED ZEROFILL NOT NULL,
	c INT(5) DEFAULT NULL,
	d INT(5) UNSIGNED ZEROFILL NOT NULL,
	e INT(15) DEFAULT NULL,
	PRIMARY KEY (`id`)
)

Commands to insert data into the table:

+----+------------+-------------+------------+------------+------------+
| id | a          | b           | c          | d          | e          |
+----+------------+-------------+------------+------------+------------+
|  1 |          1 | 00000000001 |          1 |      00001 |          1 |
|  2 | 1234567890 | 01234567890 | 1234567890 | 1234567890 | 1234567890 |
+----+------------+-------------+------------+------------+------------+

以上内容有助于理解以下内容:

  • 如果列有ZEROFILL,它将始终存储该列的字符数。在我们的示例中,列b将始终存储至少11个字符的整数
  • 显示宽度不限制可以存储在列中的值。我们仍然可以将值存储到INT(5)列(在我们的示例中是c和d列)中允许的最大INT值为止。

如果字段不是UNSIGNED ZEROFILL,显示宽度的用途是什么

如果列不是UNSIGNED ZEROFILL, mysql命令行不使用显示宽度。但是,如果其他应用程序需要,也可以使用它。应用程序可以获取元数据以获取列的显示宽度,然后将其用于设置列的宽度或显示列中的数字等。下面是一个PHP示例,它可以用来显示表中的值,以便它们可以正确对齐和填充。

$result = $mysqli->query('SELECT e FROM zerofill_demo WHERE id = 1');
$metadata = $result->fetch_field_direct(0); // fetch metadata from first field (e)
$length = $metadata->length; // get the length from it
$row = $result->fetch_assoc();
printf("%$0{$length}d\n", $row['e']); // prints e in a column 15 chars wide

上面的代码将输出e的值:

000000000000001

翻译来源: https://www.virendrachandak.com/techtalk/mysql-int11-what-does-it-means/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值