MySql中的TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
数据类型 | 默认长度 | 字节 | 有符号 | 无符号 |
tinyint | 无符号: 3 有符号: 4 | 1 | -128 ~ 127 | 0 ~ 255 |
smallint | 无符号: 5 有符号: 6 | 2 | -32768 ~ 32767 | 0 ~ 65535 |
mediumint | 无符号: 8 有符号: 9 | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
int | 无符号: 10 有符号: 11 | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
bigint | 无符号: 20 有符号: 20 | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
INT[(M)] [UNSIGNED] [ZEROFILL]
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
integer是int的同义词, 本质上没有区别, 两者具有相同的属性和功能。
以下是官方的解释:
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
This type is a synonym for INT.
以TINYINT[(M)] [UNSIGNED] [ZEROFILL]为例:
M说明:
指定显示长度, 并非数据取值大小。
#创建test表, 指定数据类型tinyint, 长度分别为1, 2
mysql> create table test(
-> type tinyint(1),
-> size tinyint(2)
-> );
mysql> insert into test(type,size) values (127, 127); // 插入成功
Query OK, 1 row affected (0.00 sec)
mysql> insert into test(type,size) values (128, 128); // 插入失败:无符号
1264 - Out of range value for column 'type' at row 1
从这里就可以看出, 指定的M, 与插入数值无关。无论数值大小, 占用的字节都是固定的, 只要在存储区间就可以插入。
最大数值由来:
tinyint 占用1个字节(1 bytes = 8 bit), 共8位二进制位, 2^8 = 256, 那无符号就是[0,255]
UNSIGNED说明:
加上UNSIGNED属性后就是我们说的无符号(0-255, 因为不带符号都是正整数)
ZEROFILL说明:
ZEROFILL会把UNSIGNED也给带上, 而且会进行前导零填充(即存储数值不满显示宽度M时, 会在数值前填充0)
#修改 size属性
mysql> alter table test modify size tinyint(3) unsigned zerofill;
Query OK, 2 rows affected (0.01 sec)
mysql> insert into test(type,size) values (127, 8);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+------+
| type | size |
+------+------+
| 127 | 127 |
| 127 | 008 |
+------+------+
2 rows in set (0.04 sec)
更多查看: https://dev.mysql.com/doc/refman/5.7/en/numeric-types.html