最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql的bigint?和?bigint(20)?主鍵自增的區(qū)別解析

 更新時間:2026年01月13日 11:48:08   作者:東方巴黎~Sunsiny  
bigint和bigint(20)在MySQL中作為主鍵自增時,功能完全相同,本文介紹mysql的bigint和bigint(20)主鍵自增的區(qū)別,感興趣的朋友跟隨小編一起看看吧

?bigint和bigint(20)主鍵自增的區(qū)別(完整解答,開發(fā)必看)

你的這個問題是 MySQL開發(fā)高頻疑問+面試常考點,也是新手極易混淆的點,結(jié)論先給你:

id bigint NOT NULL AUTO_INCREMENT
id bigint(20) NOT NULL AUTO_INCREMENT
?? 本質(zhì)無區(qū)別,功能完全一樣,生產(chǎn)上用哪個都可以!
?? 唯一的區(qū)別:只是 MySQL 的「顯示寬度」不一樣,對存儲、取值、自增邏輯、性能 0影響!

一、核心區(qū)別:bigint≈bigint(20),只有「顯示寬度」的差異

? 先明確 MySQL 中數(shù)值類型(M)的含義

MySQL 里的 int(11)、bigint(20)tinyint(4) 中,括號里的數(shù)字不是「取值范圍」,而是「顯示寬度(Display Width)」,這個是重中之重,90%的程序員都理解錯了!

  • bigint :等價于 bigint(20),MySQL 對 bigint 類型的默認顯示寬度就是 20
  • bigint(20):手動指定了顯示寬度為20

? 什么是「顯示寬度」?

顯示寬度的作用:僅用于當你使用 ZEROFILL 零填充約束時,控制數(shù)字的「展示格式」,僅此而已。

  • 沒有 ZEROFILL 時,bigintbigint(20) 完全一樣,查詢出來的數(shù)字都是正常樣式(比如 1、100、10000)
  • ZEROFILL 時,會自動補0到指定的顯示寬度,比如 bigint(6) zerofill 存數(shù)字123,查詢出來是000123

二、重中之重:這3個關(guān)鍵點,完全一致(核心重點)

你最關(guān)心的「主鍵自增、存儲、取值」這些核心功能,兩者沒有任何區(qū)別,這也是為什么生產(chǎn)里兩種寫法都能見到的原因,3個核心一致點:

? 1. 取值范圍完全相同

bigint 是 MySQL 的8字節(jié)整數(shù)類型,不管寫不寫(20),取值范圍都是固定的:

  • 有符號:-9223372036854775808 ~ 9223372036854775807
  • 無符號:0 ~ 18446744073709551615

對你的主鍵自增來說:正數(shù)自增從1開始,能存 90億億+ 的數(shù)據(jù),這輩子都用不完,不用擔心主鍵不夠用。

? 2. 占用的磁盤存儲完全相同

兩者都是 bigint 類型,固定占用 8 個字節(jié)的磁盤空間,不會因為寫了(20)就多占1字節(jié),也不會少占。
對比一下你之前踩過的坑(補充給你):

  • int / int(11) → 固定4字節(jié),最多存2147萬
  • bigint / bigint(20) → 固定8字節(jié),最多存90億億+

? 開發(fā)建議:主鍵一律用 bigint 自增,不管寫不寫20,永遠不會出現(xiàn)主鍵溢出的問題,這是行業(yè)規(guī)范。

? 3. 主鍵自增的邏輯完全相同

兩種寫法的 AUTO_INCREMENT 自增規(guī)則沒有任何差異:

  • 插入數(shù)據(jù)時,不用手動賦值id,數(shù)據(jù)庫自動從1開始+1遞增
  • 刪數(shù)據(jù)不會回滾自增序列,比如刪了id=10的數(shù)據(jù),下次新增還是11
  • 批量插入、主鍵回填等功能,兩者表現(xiàn)一致

三、補充:為什么會有bigint(20)這種寫法?【歷史原因+規(guī)范】

這個寫法不是沒用的,而是有由來的,也是團隊開發(fā)里的「約定俗成」,兩種常見場景:

? 1. 歷史遺留的「規(guī)范寫法」

MySQL 官方對各類數(shù)值類型的默認顯示寬度做了規(guī)定:

  • tinyint → 默認 tinyint(4)
  • smallint → 默認 smallint(6)
  • int → 默認 int(11)
  • bigint → 默認 bigint(20)

很多老程序員/公司的建表規(guī)范里,會手動把默認寬度寫上,比如 int(11)bigint(20),目的是「代碼可讀性更好」,團隊里所有人一看就知道是標準的數(shù)值類型,僅此而已。

? 2. 區(qū)分「有符號/無符號」的視覺暗示

MySQL 中 int(11)有符號的默認寬度,int(10) 一般是無符號的默認寬度;
同理 bigint(20) 是有符號的默認寬度,bigint(19) 是無符號的默認寬度。
手動寫上寬度,團隊成員能一眼看出字段的符號屬性,是一種「開發(fā)默契」。

四、延伸:這2個坑千萬別踩!(99%新手必犯)

結(jié)合你的場景是「主鍵自增」,我把和這個問題相關(guān)的高頻錯誤寫法+避坑點一起寫給你,都是生產(chǎn)環(huán)境踩過的坑,看完直接避坑:

? 坑1:以為bigint(10)比bigint(20)存的數(shù)字少

錯! 顯示寬度不影響取值范圍,bigint(1)bigint(20) 存的數(shù)字范圍完全一樣,都是8字節(jié)的bigint,只是展示格式不同。

? 坑2:主鍵自增列加了DEFAULT NULL

id bigint(20) AUTO_INCREMENT DEFAULT NULL PRIMARY KEY -- ? 語法報錯

MySQL 硬性規(guī)則:AUTO_INCREMENT 必須搭配 NOT NULL,自增主鍵永遠不會為空,寫了DEFAULT NULL會直接報錯 Incorrect column specifier for column 'id'。

? 正確的2種主鍵自增寫法(都可以,生產(chǎn)通用)

-- 寫法1:簡寫(推薦,簡潔)
`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID',
-- 寫法2:規(guī)范寫法(團隊常用,可讀性強)
`id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID',

五、拓展:ZEROFILL零填充的實際使用(唯一用到顯示寬度的場景)

前面說過,顯示寬度只有搭配 ZEROFILL 時才有實際效果,給你舉個例子,幫你徹底理解,這個功能偶爾會用到(比如生成訂單號、編號):

-- 創(chuàng)建測試表,給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;
-- 插入數(shù)據(jù)
INSERT INTO test(name) VALUES('測試1'),('測試2'),('測試100');
-- 查詢結(jié)果
SELECT * FROM test;

查詢出來的id是這樣的:

id      name
000001  測試1
000002  測試2
000100  測試100

? 效果:自動補0到指定的顯示寬度6位,但底層存儲的還是數(shù)字1、2、100,只是展示的時候補了0,對業(yè)務(wù)邏輯無影響。

? 最終總結(jié)(一句話搞定,看完就懂)

bigintbigint(20) 無功能區(qū)別,都是8字節(jié)的長整型,主鍵自增邏輯一致,存儲一致,取值范圍一致;唯一區(qū)別是顯示寬度,bigint是默認的20位寬度,bigint(20)是手動指定,開發(fā)中用哪個都可以。

? 開發(fā)選型建議

  1. 個人開發(fā)/快速建表:用 bigint 即可,簡潔高效;
  2. 團隊開發(fā)/公司規(guī)范:用 bigint(20),符合行業(yè)約定,可讀性更好;
  3. 所有業(yè)務(wù)表主鍵:一律用 bigint 自增,別用int,避免數(shù)據(jù)量上來主鍵溢出。

這是MySQL的基礎(chǔ)核心知識點,很多程序員工作好幾年都沒搞懂,現(xiàn)在徹底搞懂了,以后寫建表語句再也不會糾結(jié)了??

到此這篇關(guān)于mysql的bigint 和 bigint(20) 主鍵自增的區(qū)別的文章就介紹到這了,更多相關(guān)mysql bigint 和 bigint(20) 主鍵自增內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql中的排序規(guī)則utf8_unicode_ci、utf8_general_ci的區(qū)別總結(jié)

    Mysql中的排序規(guī)則utf8_unicode_ci、utf8_general_ci的區(qū)別總結(jié)

    Mysql中utf8_general_ci與utf8_unicode_ci有什么區(qū)別呢?在編程語言中,通常用unicode對中文字符做處理,防止出現(xiàn)亂碼,那么在MySQL里,為什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢?
    2014-04-04
  • Mysql中的Datetime和Timestamp比較

    Mysql中的Datetime和Timestamp比較

    這篇文章主要介紹了Mysql中的Datetime和Timestamp比較,本文總結(jié)了它們的相同點和不同點以及時間格式介紹等,需要的朋友可以參考下
    2015-03-03
  • Mysql中 IFNULL函數(shù)的使用詳解

    Mysql中 IFNULL函數(shù)的使用詳解

    IFNULL()函數(shù)在MySQL中用來檢查第一個表達式是否為NULL,非NULL則返回第一個值,否則返回第二個值,本文就來詳細的介紹一下如何使用,感興趣的可以了解一下
    2024-09-09
  • MyBatis編寫動態(tài)SQL實例

    MyBatis編寫動態(tài)SQL實例

    這篇文章主要介紹了MyBatis編寫動態(tài)SQL實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-05-05
  • MySQL sleep函數(shù)使用方法詳解

    MySQL sleep函數(shù)使用方法詳解

    sleep函數(shù)時「延時」指定時間(單位秒),也就是讓程序停止執(zhí)行一段指定的時間,本文就給大家簡單的介紹一下MySQL sleep函數(shù)使用方法,需要的朋友可以參考下
    2023-07-07
  • MYSQL比對版本號字符串的方法實例

    MYSQL比對版本號字符串的方法實例

    因為mysql的版本較多,所以最近也踩了一個因為版本號字符串的坑,下面這篇文章主要給大家介紹了關(guān)于MYSQL比對版本號字符串的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • MySQL?count(*)統(tǒng)計總數(shù)問題匯總

    MySQL?count(*)統(tǒng)計總數(shù)問題匯總

    在日常開發(fā)工作中,我經(jīng)常會遇到需要統(tǒng)計總數(shù)的場景,比如:統(tǒng)計訂單總數(shù)、統(tǒng)計用戶總數(shù)等,這篇文章主要介紹了MySQL?count(*)統(tǒng)計總數(shù)的問題解析,需要的朋友可以參考下
    2022-09-09
  • 如何解決mysql導(dǎo)入sql文件慢、錯等問題

    如何解決mysql導(dǎo)入sql文件慢、錯等問題

    這篇文章主要介紹了如何解決mysql導(dǎo)入sql文件慢、錯等問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • mysql使用mysqldump備份、還原數(shù)據(jù)庫詳解教程

    mysql使用mysqldump備份、還原數(shù)據(jù)庫詳解教程

    mysqldump是一個用于備份MySQL數(shù)據(jù)庫的命令行工具,它可以將數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)導(dǎo)出到一個SQL文件中,以便在需要時進行恢復(fù)或遷移數(shù)據(jù)庫,這篇文章主要介紹了mysql使用mysqldump備份、還原數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • 將圖片儲存在MySQL數(shù)據(jù)庫中的幾種方法

    將圖片儲存在MySQL數(shù)據(jù)庫中的幾種方法

    今天小編就為大家分享一篇關(guān)于將圖片儲存在MySQL數(shù)據(jù)庫中的幾種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

巢湖市| 宁陵县| 宁城县| 凤台县| 清河县| 思茅市| 崇明县| 白水县| 隆化县| 江油市| 秦皇岛市| 泸西县| 安吉县| 慈溪市| 简阳市| 泊头市| 永昌县| 株洲县| 凯里市| 横山县| 闻喜县| 化隆| 安塞县| 怀宁县| 巴青县| 芦山县| 昌宁县| 玉溪市| 孟州市| 白朗县| 海城市| 屏东县| 水城县| 岱山县| 闻喜县| 太仓市| 诏安县| 山西省| 公主岭市| 方城县| 彰武县|