MySQL INT 类型介绍
在本文中,我们将带您了解 MySQL 中的整数类型,这包括 INT
, SMALLINT
, TINYINT
, MEDIUMINT
和 BIGINT
。
在 MySQL 中,INT
和 INTEGER
是整数数据类型。为了更高效的存储不同长度的数字,MySQL 支持几种不同的整数数据类型: INT
, SMALLINT
, TINYINT
, MEDIUMINT
和 BIGINT
。
下表展示了不同的整数类型的字节数和数值范围:
类型 | 字节数 | 最小值 | 最大值 | 最小值(无符号) | 最大值(无符号) |
---|---|---|---|---|---|
TINYINT |
1 |
-128 |
127 |
0 |
255 |
SMALLINT |
2 |
-32768 |
32767 |
0 |
65535 |
MEDIUMINT |
3 |
-8388608 |
8388607 |
0 |
16777215 |
INT |
4 |
-2147483648 |
2147483647 |
0 |
4294967295 |
BIGINT |
8 |
-263 |
263-1 |
0 |
264-1 |
INT
和INTEGER
是同义词。
MySQL INT 语法
MySQL INT 类型使用起来简单,如下:
INT [UNSIGNED]
这里: UNSIGNED
属性标识了此数据类型为无符号整数。
或者
INT(display_width) ZEROFILL
这里:
display_width
是INT
的显示宽度属性。ZEROFILL
属性表示如果没有达到display_width
指定的显示宽度需要在数值的左侧填充0
。当您指定了ZEROFILL
属性后,MySQL 会自动添加UNSIGNED
属性到列中。- 从 MySQL 8.0.17 开始,显示宽度和
ZEROFILL
属性都不再建议使用,并且会在将来的版本中删除。
MySQL INT 数据类型实例
INT
数据类型列用来存储整数,比如年龄,数量等,它也可以结合 AUTO_INCREMENT
作为主键列。
定义 INT 列并插入数据
让我们看一下简单的整数列的例子。首先我们创建一个演示表:
CREATE TABLE test_int(
name char(30) NOT NULL,
age INT NOT NULL
);
上面 SQL 中的 INT
也可以使用 INTEGER
代替。
让我们插入两条数据:
INSERT INTO test_int (name, age)
VALUES ('Tom', '23'), ('Lucy', 20);
然后我们使用以下的 SELECT
语句查询表中的行:
SELECT * FROM test_int;
+------+-----+
| name | age |
+------+-----+
| Tom | 23 |
| Lucy | 20 |
+------+-----+
使用 INT 列作为自增列
通常,一个表的主键列使用 INT
数据类型列结合 AUTO_INCREMENT
属性作为主键。请看下面的 SQL:
CREATE TABLE test_int_pk(
id INT AUTO_INCREMENT PRIMARY KEY,
name char(30) NOT NULL,
age INT NOT NULL
);
这里,id
列是主键列。它的类型是 INT
,并且使用了 AUTO_INCREMENT
属性。
让我们插入和上面例子中相同的两条数据:
INSERT INTO test_int_pk (name, age)
VALUES ('Tom', '23'), ('Lucy', 20);
然后我们使用以下的 SELECT
语句查询表中的行:
SELECT * FROM test_int_pk;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tom | 23 |
| 2 | Lucy | 20 |
+----+------+-----+
这里, id
列自动生成,并且每行的值都会自增 1
。
显示宽度和 ZEROFILL
属性
MySQL 为 INT
数据类型提供了显示宽度和 ZEROFILL
属性,主要用于格式话显示数字。不过,从 MySQL 8.0.17 开始,显示宽度和 ZEROFILL
属性都不再建议使用,并且会在将来的版本中删除。如果有类似的格式化需求,可以使用 LPAD()
函数实现。
让我们看一个例子。 我们创建一个演示表:
CREATE TABLE test_int_zerofill(
v2 INT(2) ZEROFILL,
v3 INT(3) ZEROFILL,
v4 INT(4) ZEROFILL
);
然后,我们再插入一行数据:
INSERT INTO test_int_zerofill (v2, v3, v4)
VALUES (2, 3, 4), (200, 3000, 40000);
然后我们使用以下的 SELECT
语句查询表中的行:
SELECT * FROM test_int_zerofill;
+------+------+-------+
| v2 | v3 | v4 |
+------+------+-------+
| 02 | 003 | 0004 |
| 200 | 3000 | 40000 |
+------+------+-------+
这里,
v2
列定义的显示宽度为2
, 值2
的宽度只有 1 位, 因此输出时在左侧用1
个0
进行填充,而值200
宽度位 3 位,故原样输出。v3
列定义的显示宽度为3
, 值3
的宽度只有 1 位, 因此输出时在左侧用2
个0
进行填充,而值3000
宽度位 4 位,故原样输出。v4
列定义的显示宽度为4
, 值4
的宽度只有 1 位, 因此输出时在左侧用3
个0
进行填充,而值40000
宽度位 5 位,故原样输出。
无符号整数数据类型
有时候,我们不希望输入负数,我们可以使用无符号整数类型。无符号类型的列只接受 0 和 正整数。当你向一个无符号整数列插入负数时, MySQL 会返回错误提示。
首先,我们创建一个演示表:
CREATE TABLE test_int_unsigned(
v INT UNSIGNED
);
然后,我们尝试向列中插入一个整数:
INSERT INTO test_int_unsigned VALUES (1);
它能正常插入到表中。现在,我们再尝试插入一个负数:
INSERT INTO test_int_unsigned VALUES (-1);
MySQL 返回了一个错误:
ERROR 1264 (22003): Out of range value for column 'v' at row 1
如果我们禁止向列中插入负数,无符号整数类型是个不错的选择。
结论
在本文中,我们学习了 MySQL 中的 INT
数据类型,以及如何使用 INT
设计数据库。
INT
和INTEGER
是同义词,都是整数数据类型。- MySQL 支持几种不同的整数数据类型:
INT
,SMALLINT
,TINYINT
,MEDIUMINT
和BIGINT
。 INT UNSIGNED
是无符号整数。- 主键列通常使用
INT
和AUTO_INCREMENT
。