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
这样的写法,这两者有什么区别,各自又代表什么意思呢?
- 对应Integer 类型而言,仅表示字段的显示宽度。
- 对于DECIMAL类型,表示数字的总数。
- 对于字符字段,这是可以存储的最大字符数,例如VARCHAR(20)可以存储20个字符。
显示宽度并不影响可以存储在该列中的最大值。int(3)
和int(11)
所能存储的最大范围是一样的。
将某个字段设置成INT(20)
并不意味着将能够存储20位数字,这个字段最终能存储的最大范围还是 INT 的范围。
示例
创建一张临时表:
1 | CREATE TABLE tmp_table_a ( |
查看表结构:
1 | mysql> desc tmp_table_a; |
插入超过”长度”的数字:
1 | INSERT INTO tmp_table_a(id, name) VALUES(123456, "boo"); |
查看结果,发现数字并没有插入失败:
1 | mysql> select * from tmp_table_a; |
有无符号的区别
那么问题来了,既然加不加数字并没有什么区别,那为什么还多此一举呢?
这是因为“正常”情况下确实没有什么区别,只有当字段设置为UNSIGNED ZEROFILL 属性时,为INT 增加数字才会有意义。
表示如果要存储的数字少于N 个字符,则这些数字将在左侧补零。
示例
创建一张 UNSIGNED ZEROFILL 的数据表:
1 | CREATE TABLE tmp_table_b ( |
查看表结构:
1 | mysql> desc tmp_table_b; |
插入记录:
1 | INSERT INTO tmp_table_b(id, name) VALUES(1, "boo"); |
查看记录:
1 | mysql> select * from tmp_table_b; |
总结
- 对于Integer 类型而言,“数字”并不会限制其能存储的最大范围。
- 有无符号,不仅会限制其能存储的最大范围,还可以配置“数字”自动补零。