Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql bigint 和 bigint(20) 主键自增

mysql的bigint 和 bigint(20) 主键自增的区别解析

作者:东方巴黎~Sunsiny

bigint和bigint(20)在MySQL中作为主键自增时,功能完全相同,本文介绍mysql的bigint和bigint(20)主键自增的区别,感兴趣的朋友跟随小编一起看看吧

✅bigint和bigint(20)主键自增的区别(完整解答,开发必看)

你的这个问题是 MySQL开发高频疑问+面试常考点,也是新手极易混淆的点,结论先给你:

id bigint NOT NULL AUTO_INCREMENT
id bigint(20) NOT NULL AUTO_INCREMENT
✔️ 本质无区别,功能完全一样,生产上用哪个都可以!
✔️ 唯一的区别:只是 MySQL 的「显示宽度」不一样,对存储、取值、自增逻辑、性能 0影响!

一、核心区别:bigint≈bigint(20),只有「显示宽度」的差异

✅ 先明确 MySQL 中数值类型(M)的含义

MySQL 里的 int(11)bigint(20)tinyint(4) 中,括号里的数字不是「取值范围」,而是「显示宽度(Display Width)」,这个是重中之重,90%的程序员都理解错了!

✅ 什么是「显示宽度」?

显示宽度的作用:仅用于当你使用 ZEROFILL 零填充约束时,控制数字的「展示格式」,仅此而已

二、重中之重:这3个关键点,完全一致(核心重点)

你最关心的「主键自增、存储、取值」这些核心功能,两者没有任何区别,这也是为什么生产里两种写法都能见到的原因,3个核心一致点:

✅ 1. 取值范围完全相同

bigint 是 MySQL 的8字节整数类型,不管写不写(20),取值范围都是固定的:

对你的主键自增来说:正数自增从1开始,能存 90亿亿+ 的数据,这辈子都用不完,不用担心主键不够用。

✅ 2. 占用的磁盘存储完全相同

两者都是 bigint 类型,固定占用 8 个字节的磁盘空间,不会因为写了(20)就多占1字节,也不会少占。
对比一下你之前踩过的坑(补充给你):

✅ 开发建议:主键一律用 bigint 自增,不管写不写20,永远不会出现主键溢出的问题,这是行业规范。

✅ 3. 主键自增的逻辑完全相同

两种写法的 AUTO_INCREMENT 自增规则没有任何差异:

三、补充:为什么会有bigint(20)这种写法?【历史原因+规范】

这个写法不是没用的,而是有由来的,也是团队开发里的「约定俗成」,两种常见场景:

✅ 1. 历史遗留的「规范写法」

MySQL 官方对各类数值类型的默认显示宽度做了规定:

很多老程序员/公司的建表规范里,会手动把默认宽度写上,比如 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,对业务逻辑无影响。

✨ 最终总结(一句话搞定,看完就懂)

bigintbigint(20) 无功能区别,都是8字节的长整型,主键自增逻辑一致,存储一致,取值范围一致;唯一区别是显示宽度,bigint是默认的20位宽度,bigint(20)是手动指定,开发中用哪个都可以。

✅ 开发选型建议

  1. 个人开发/快速建表:用 bigint 即可,简洁高效;
  2. 团队开发/公司规范:用 bigint(20),符合行业约定,可读性更好;
  3. 所有业务表主键:一律用 bigint 自增,别用int,避免数据量上来主键溢出。

这是MySQL的基础核心知识点,很多程序员工作好几年都没搞懂,现在彻底搞懂了,以后写建表语句再也不会纠结了👍

到此这篇关于mysql的bigint 和 bigint(20) 主键自增的区别的文章就介绍到这了,更多相关mysql bigint 和 bigint(20) 主键自增内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文