✅bigint和bigint(20)主键自增的区别(完整解答,开发必看)
你的这个问题是 mysql开发高频疑问+面试常考点,也是新手极易混淆的点,结论先给你:
idbigint not null auto_incrementidbigint(20) not null auto_increment
✔️ 本质无区别,功能完全一样,生产上用哪个都可以!
✔️ 唯一的区别:只是 mysql 的「显示宽度」不一样,对存储、取值、自增逻辑、性能 0影响!
一、核心区别:bigint≈bigint(20),只有「显示宽度」的差异
✅ 先明确 mysql 中数值类型(m)的含义
mysql 里的 int(11)、bigint(20)、tinyint(4) 中,括号里的数字不是「取值范围」,而是「显示宽度(display width)」,这个是重中之重,90%的程序员都理解错了!
bigint:等价于bigint(20),mysql 对 bigint 类型的默认显示宽度就是 20bigint(20):手动指定了显示宽度为20
✅ 什么是「显示宽度」?
显示宽度的作用:仅用于当你使用 zerofill 零填充约束时,控制数字的「展示格式」,仅此而已。
- 没有
zerofill时,bigint和bigint(20)完全一样,查询出来的数字都是正常样式(比如 1、100、10000) - 有
zerofill时,会自动补0到指定的显示宽度,比如bigint(6) zerofill存数字123,查询出来是000123
二、重中之重:这3个关键点,完全一致(核心重点)
你最关心的「主键自增、存储、取值」这些核心功能,两者没有任何区别,这也是为什么生产里两种写法都能见到的原因,3个核心一致点:
✅ 1. 取值范围完全相同
bigint 是 mysql 的8字节整数类型,不管写不写(20),取值范围都是固定的:
- 有符号:
-9223372036854775808 ~ 9223372036854775807 - 无符号:
0 ~ 18446744073709551615
对你的主键自增来说:正数自增从1开始,能存 90亿亿+ 的数据,这辈子都用不完,不用担心主键不够用。
✅ 2. 占用的磁盘存储完全相同
两者都是 bigint 类型,固定占用 8 个字节的磁盘空间,不会因为写了(20)就多占1字节,也不会少占。
对比一下你之前踩过的坑(补充给你):
int/int(11)→ 固定4字节,最多存2147万bigint/bigint(20)→ 固定8字节,最多存90亿亿+
✅ 开发建议:主键一律用 bigint 自增,不管写不写20,永远不会出现主键溢出的问题,这是行业规范。
✅ 3. 主键自增的逻辑完全相同
两种写法的 auto_increment 自增规则没有任何差异:
- 插入数据时,不用手动赋值id,数据库自动从1开始+1递增
- 删数据不会回滚自增序列,比如删了id=10的数据,下次新增还是11
- 批量插入、主键回填等功能,两者表现一致
三、补充:为什么会有bigint(20)这种写法?【历史原因+规范】
这个写法不是没用的,而是有由来的,也是团队开发里的「约定俗成」,两种常见场景:
✅ 1. 历史遗留的「规范写法」
mysql 官方对各类数值类型的默认显示宽度做了规定:
tinyint→ 默认tinyint(4)smallint→ 默认smallint(6)int→ 默认int(11)bigint→ 默认bigint(20)
很多老程序员/公司的建表规范里,会手动把默认宽度写上,比如 int(11)、bigint(20),目的是「代码可读性更好」,团队里所有人一看就知道是标准的数值类型,仅此而已。
✅ 2. 区分「有符号/无符号」的视觉暗示
mysql 中 int(11) 是有符号的默认宽度,int(10) 一般是无符号的默认宽度;
同理 bigint(20) 是有符号的默认宽度,bigint(19) 是无符号的默认宽度。
手动写上宽度,团队成员能一眼看出字段的符号属性,是一种「开发默契」。
四、延伸:这2个坑千万别踩!(99%新手必犯)
结合你的场景是「主键自增」,我把和这个问题相关的高频错误写法+避坑点一起写给你,都是生产环境踩过的坑,看完直接避坑:
❌ 坑1:以为bigint(10)比bigint(20)存的数字少
错! 显示宽度不影响取值范围,bigint(1) 和 bigint(20) 存的数字范围完全一样,都是8字节的bigint,只是展示格式不同。
❌ 坑2:主键自增列加了default null
id bigint(20) auto_increment default null primary key -- ❌ 语法报错
mysql 硬性规则:auto_increment 必须搭配 not null,自增主键永远不会为空,写了default null会直接报错 incorrect column specifier for column 'id'。
✅ 正确的2种主键自增写法(都可以,生产通用)
-- 写法1:简写(推荐,简洁) `id` bigint not null auto_increment primary key comment '主键id', -- 写法2:规范写法(团队常用,可读性强) `id` bigint(20) not null auto_increment primary key comment '主键id',
五、拓展:zerofill零填充的实际使用(唯一用到显示宽度的场景)
前面说过,显示宽度只有搭配 zerofill 时才有实际效果,给你举个例子,帮你彻底理解,这个功能偶尔会用到(比如生成订单号、编号):
-- 创建测试表,给id加zerofill
create table test (
`id` bigint(6) not null auto_increment zerofill primary key comment '主键id',
`name` varchar(20) default null
) engine=innodb default charset=utf8mb4;
-- 插入数据
insert into test(name) values('测试1'),('测试2'),('测试100');
-- 查询结果
select * from test;查询出来的id是这样的:
id name 000001 测试1 000002 测试2 000100 测试100
✅ 效果:自动补0到指定的显示宽度6位,但底层存储的还是数字1、2、100,只是展示的时候补了0,对业务逻辑无影响。
✨ 最终总结(一句话搞定,看完就懂)
bigint和bigint(20)无功能区别,都是8字节的长整型,主键自增逻辑一致,存储一致,取值范围一致;唯一区别是显示宽度,bigint是默认的20位宽度,bigint(20)是手动指定,开发中用哪个都可以。
✅ 开发选型建议
- 个人开发/快速建表:用
bigint即可,简洁高效; - 团队开发/公司规范:用
bigint(20),符合行业约定,可读性更好; - 所有业务表主键:一律用 bigint 自增,别用int,避免数据量上来主键溢出。
这是mysql的基础核心知识点,很多程序员工作好几年都没搞懂,现在彻底搞懂了,以后写建表语句再也不会纠结了👍
到此这篇关于mysql的bigint 和 bigint(20) 主键自增的区别的文章就介绍到这了,更多相关mysql bigint 和 bigint(20) 主键自增内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论