MySQL中整型数据类型用法详解

一、整数类型的取值范围和宽度

  • 整数类型对应的取值范围:
类型 字节 有符号取值范围 无符号取值范围
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。如果只是单单指定了长度,没有使用 ZEROFILL 关键字,则跟没有指定是一样的效果

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开始,整数数据类型不推荐使用显示宽度属性。

posted @ 2022-10-24 18:23  danielzzz  阅读(287)  评论(0编辑  收藏  举报