乐趣区

关于mysql:MySQL-Integer类型与INT11详解

MySQL 反对的整数类型有 TINYINT、SMALLINT、MEDIUMINT、INT、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 -9223372036854775808 (9223372036854775807 0 18446744073709551615

有无限度的区别

在创立数据表时,通常会看见 int(11)int 这样的写法,这两者有什么区别,各自又代表什么意思呢?

  1. 对应 Integer 类型而言,仅示意字段的显示宽度。
  2. 对于 DECIMAL 类型,示意数字的总数。
  3. 对于字符字段,这是能够存储的最大字符数,例如 VARCHAR(20)能够存储 20 个字符。

显示宽度并不影响能够存储在该列中的最大值。int(3)int(11) 所能存储的最大范畴是一样的。

将某个字段设置成 INT(20) 并不意味着将可能存储 20 位数字,这个字段最终能存储的最大范畴还是 INT 的范畴。

示例

创立一张长期表:

CREATE TABLE tmp_table_a (id INT(3) NOT NULL AUTO_INCREMENT,
    name varchar(16) DEFAULT '' NOT NULL, 
    PRIMARY KEY (`id`)
);

查看表构造:

mysql> desc tmp_table_a;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(3)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(16) | NO   |     |         |                |
+-------+-------------+------+-----+---------+----------------+

插入超过 ” 长度 ” 的数字:

INSERT INTO tmp_table_a(id, name) VALUES(123456, "boo");

查看后果,发现数字并没有插入失败:

mysql> select * from tmp_table_a;
+--------+------+
| id     | name |
+--------+------+
| 123456 | boo  |
+--------+------+
1 row in set (0.00 sec)

有无符号的区别

那么问题来了,既然加不加数字并没有什么区别,那为什么还多此一举呢?

这是因为“失常”状况下的确没有什么区别,只有当 字段设置为 UNSIGNED ZEROFILL 属性时,为 INT 减少数字才会有意义。

示意如果要存储的数字少于 N 个字符,则这些数字将在左侧补零。

示例

创立一张 UNSIGNED ZEROFILL 的数据表:

CREATE TABLE tmp_table_b (id INT(3) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
    name varchar(16) DEFAULT '' NOT NULL, 
    PRIMARY KEY (`id`)
);

查看表构造:

mysql> desc tmp_table_b;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type                     | Null | Key | Default | Extra          |
+-------+--------------------------+------+-----+---------+----------------+
| id    | int(3) unsigned zerofill | NO   | PRI | NULL    | auto_increment |
| name  | varchar(16)              | NO   |     |         |                |
+-------+--------------------------+------+-----+---------+----------------+

插入记录:

INSERT INTO tmp_table_b(id, name) VALUES(1, "boo");

查看记录:

mysql> select * from tmp_table_b;
+-----+------+
| id  | name |
+-----+------+
| 001 | boo  |
+-----+------+

总结

  1. 对于 Integer 类型而言,“数字”并不会限度其能存储的最大范畴。
  2. 有无符号,不仅会限度其能存储的最大范畴,还能够配置“数字”主动补零。

参考链接

  • MySQL Integer 类型与 INT(11)
退出移动版