MySQL INT 类型介绍

在本文中,我们将带您了解 MySQL 中的整数类型,这包括 INT, SMALLINT, TINYINT, MEDIUMINTBIGINT

在 MySQL 中,INTINTEGER 是整数数据类型。为了更高效的存储不同长度的数字,MySQL 支持几种不同的整数数据类型: INT, SMALLINT, TINYINT, MEDIUMINTBIGINT

下表展示了不同的整数类型的字节数和数值范围:

类型 字节数 最小值 最大值 最小值(无符号) 最大值(无符号)
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

INTINTEGER 是同义词。

MySQL INT 语法

MySQL INT 类型使用起来简单,如下:

INT [UNSIGNED]

这里: UNSIGNED 属性标识了此数据类型为无符号整数。

或者

INT(display_width) ZEROFILL

这里:

  • display_widthINT 的显示宽度属性。
  • 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 位, 因此输出时在左侧用 10 进行填充,而值 200 宽度位 3 位,故原样输出。
  • v3 列定义的显示宽度为 3, 值 3 的宽度只有 1 位, 因此输出时在左侧用 20 进行填充,而值 3000 宽度位 4 位,故原样输出。
  • v4 列定义的显示宽度为 4, 值 4 的宽度只有 1 位, 因此输出时在左侧用 30 进行填充,而值 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 设计数据库。

  1. INTINTEGER 是同义词,都是整数数据类型。
  2. MySQL 支持几种不同的整数数据类型: INT, SMALLINT, TINYINT, MEDIUMINTBIGINT
  3. INT UNSIGNED 是无符号整数。
  4. 主键列通常使用 INTAUTO_INCREMENT