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

 更新时间:2026年01月13日 11:48:08   作者:东方巴黎~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%的程序员都理解错了!

  • bigint :等价于 bigint(20),MySQL 对 bigint 类型的默认显示宽度就是 20
  • bigint(20):手动指定了显示宽度为20

✅ 什么是「显示宽度」?

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

  • 没有 ZEROFILL 时,bigintbigint(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,对业务逻辑无影响。

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

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

✅ 开发选型建议

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

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

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

相关文章

  • MySQL最左匹配原则深入分析

    MySQL最左匹配原则深入分析

    首先回顾一下什么是最左匹配(也有称之为最左前缀)?顾名思义:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配
    2022-11-11
  • MySQL 8.0版本配置my.cnf / my.ini各项配置示例详解

    MySQL 8.0版本配置my.cnf / my.ini各项配置示例详解

    在MySQL 8.0版本之前,MySQL使用的是名为my.ini的配置文件来配置数据库服务器,这篇文章主要介绍了MySQL 8.0版本配置my.cnf / my.ini各项配置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • mysql的docker容器如何设置默认的数据库技巧详解

    mysql的docker容器如何设置默认的数据库技巧详解

    这篇文章主要为大家介绍了mysql的docker容器如何设置默认的数据库技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • windows版本下mysql的安装启动和基础配置图文教程详解

    windows版本下mysql的安装启动和基础配置图文教程详解

    本文通过图文并茂的形式给大家介绍了windows版本下mysql的安装启动和基础配置图文教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • MySQL5.7中的sql_mode默认值带来的坑及解决方法

    MySQL5.7中的sql_mode默认值带来的坑及解决方法

    这篇文章主要介绍了MySQL5.7中的sql_mode默认值带来的坑及解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • MySQL数据库10秒内插入百万条数据的实现

    MySQL数据库10秒内插入百万条数据的实现

    假设现在我们要向mysql插入500万条数据,如何实现高效快速的插入进去?本文就详细的介绍一下,感兴趣的可以了解一下
    2021-10-10
  • MySQL之复合查询使用及说明

    MySQL之复合查询使用及说明

    文章讲解了SQL复合查询中emp、dept、salgrade三张表的使用,涵盖多表连接、自连接、子查询(单行/多行/多列)及合并查询(UNION/UNION ALL)等技术,通过实际案例展示如何实现员工与部门数据的关联分析、条件筛选和统计功能
    2025-09-09
  • 新手把mysql装进docker中碰到的各种问题

    新手把mysql装进docker中碰到的各种问题

    这篇文章主要给大家介绍了新手第一次把mysql装进docker中可能碰到的各种问题,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • MySQL 数据持久化过程讲解

    MySQL 数据持久化过程讲解

    这篇文章主要介绍了MySQL 数据持久化过程讲解,文章围绕主题展开详细的内容介绍,具有一定的参考价值, 需要的朋友可以参考一下,希望对你的学习有所帮助
    2022-07-07
  • 深入mysql外键关联问题的详解

    深入mysql外键关联问题的详解

    本篇文章是对mysql外键关联问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论