一、数据类型的取值范围和宽度
- 字段类型对应的取值范围:
类型 | 字节 | 有符号取值范围 | 无符号取值范围 |
---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT、INTEGER | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
- 类型默认的显示宽度:
类型 | 宽度 |
---|---|
TINYINT | 4 |
SMALLINT | 6 |
MEDIUMINT | 9 |
INT、INTEGER | 11 |
BIGINT | 20 |
MEDIUMINT 类型用肉眼数的话, 按负值“-8388608”的宽度算,应该是8,但实际默认值是9。其实默认值是按:”无符号最大值的宽度”+1 来计算的“。
显示宽度只是指明MYSQL最大可能显示的数字个数,数值的位数小于指定的宽度时会有空格填充,取决于你的设置。如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入显示出来。
显示宽度只用于显示,并不能限制取值范围和占用空间。比如INT(3)依旧还是占用4个字节的存储空间。
二、验证及结果
1、创建表语句
注:mysql 中的 ZEROFILL 意思是补零。格式为字段名 INT(M) ZEROFILL 。在插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
创建表时,可以在INT后面加入数值。请注意这个数值不代表数据的长度。例如id字段的数据类型为INT(11),注意到后面的数字11,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数,实际存储的长度还是上表中INT的取值范围即-2147483648~2147483648。
DROP TABLE IF EXISTS tab_type;
CREATE TABLE `tab_type` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`tint` TINYINT(2) ZEROFILL NOT NULL DEFAULT '0',
`sint` SMALLINT(3) ZEROFILL NOT NULL DEFAULT '0',
`mint` MEDIUMINT(4) ZEROFILL NOT NULL DEFAULT '0',
`bint` BIGINT(5) ZEROFILL NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1;
2、插入测试数据,查询结果
INSERT INTO tab_type VALUES(NULL,250,250,250,250);
SELECT * FROM tab_type;
3、查看DDL信息
可以发现当使用 zerofill 时,编译器默认会自动加 unsigned(无符号)属性,使用 unsigned 属性后,数值范围是原值的2倍。【就是不能插入负数了】
4、测试插入负数
INSERT INTO tab_type VALUES(NULL,-125,-125,-125,-125);
查看报错信息可知,插入的数据超出取值范围
TIP:从MySQL 8.0.17开始,整数数据类型不推荐使用显示宽度属性。
标签:INT,数据类型,ZEROFILL,宽度,MySQL,NULL,取值 From: https://www.cnblogs.com/godzzz/p/16822282.html