int(11)在MySQL中意味着什么?
关于int(11)在MySQL中的含义,一个非常常见的误解是,该列可以存储长度为11位的最大整数值。然而,事实并非如此。Int(11)不决定列可以存储的最大值。11是整型列的显示宽度,与字符列不同,其中数字表示可以存储的字符数。
括号中的数字不决定可以存储在整型字段中的最大值和最小值。可以存储的最大值和最小值总是固定的。下表显示了每种整数类型所需的存储空间和范围
Type | Storage (Bytes) | Minimum Value Signed | Minimum Value Unsigned | Maximum Value Signed | Maximum Value Unsigned |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 0 | 127 | 255 |
SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT | 8 | -263 | 0 | 263-1 | 264-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/