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开始,整数数据类型不推荐使用显示宽度属性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-10-24 minio安装