mysql的bigint?和?bigint(20)?主鍵自增的區(qū)別解析
?bigint和bigint(20)主鍵自增的區(qū)別(完整解答,開(kāi)發(fā)必看)
你的這個(gè)問(wèn)題是 MySQL開(kāi)發(fā)高頻疑問(wèn)+面試??键c(diǎn),也是新手極易混淆的點(diǎn),結(jié)論先給你:
idbigint NOT NULL AUTO_INCREMENTidbigint(20) NOT NULL AUTO_INCREMENT
?? 本質(zhì)無(wú)區(qū)別,功能完全一樣,生產(chǎn)上用哪個(gè)都可以!
?? 唯一的區(qū)別:只是 MySQL 的「顯示寬度」不一樣,對(duì)存儲(chǔ)、取值、自增邏輯、性能 0影響!
一、核心區(qū)別:bigint≈bigint(20),只有「顯示寬度」的差異
? 先明確 MySQL 中數(shù)值類(lèi)型(M)的含義
MySQL 里的 int(11)、bigint(20)、tinyint(4) 中,括號(hào)里的數(shù)字不是「取值范圍」,而是「顯示寬度(Display Width)」,這個(gè)是重中之重,90%的程序員都理解錯(cuò)了!
bigint:等價(jià)于bigint(20),MySQL 對(duì) bigint 類(lèi)型的默認(rèn)顯示寬度就是 20bigint(20):手動(dòng)指定了顯示寬度為20
? 什么是「顯示寬度」?
顯示寬度的作用:僅用于當(dāng)你使用 ZEROFILL 零填充約束時(shí),控制數(shù)字的「展示格式」,僅此而已。
- 沒(méi)有
ZEROFILL時(shí),bigint和bigint(20)完全一樣,查詢(xún)出來(lái)的數(shù)字都是正常樣式(比如 1、100、10000) - 有
ZEROFILL時(shí),會(huì)自動(dòng)補(bǔ)0到指定的顯示寬度,比如bigint(6) zerofill存數(shù)字123,查詢(xún)出來(lái)是000123
二、重中之重:這3個(gè)關(guān)鍵點(diǎn),完全一致(核心重點(diǎn))
你最關(guān)心的「主鍵自增、存儲(chǔ)、取值」這些核心功能,兩者沒(méi)有任何區(qū)別,這也是為什么生產(chǎn)里兩種寫(xiě)法都能見(jiàn)到的原因,3個(gè)核心一致點(diǎn):
? 1. 取值范圍完全相同
bigint 是 MySQL 的8字節(jié)整數(shù)類(lèi)型,不管寫(xiě)不寫(xiě)(20),取值范圍都是固定的:
- 有符號(hào):
-9223372036854775808 ~ 9223372036854775807 - 無(wú)符號(hào):
0 ~ 18446744073709551615
對(duì)你的主鍵自增來(lái)說(shuō):正數(shù)自增從1開(kāi)始,能存 90億億+ 的數(shù)據(jù),這輩子都用不完,不用擔(dān)心主鍵不夠用。
? 2. 占用的磁盤(pán)存儲(chǔ)完全相同
兩者都是 bigint 類(lèi)型,固定占用 8 個(gè)字節(jié)的磁盤(pán)空間,不會(huì)因?yàn)閷?xiě)了(20)就多占1字節(jié),也不會(huì)少占。
對(duì)比一下你之前踩過(guò)的坑(補(bǔ)充給你):
int/int(11)→ 固定4字節(jié),最多存2147萬(wàn)bigint/bigint(20)→ 固定8字節(jié),最多存90億億+
? 開(kāi)發(fā)建議:主鍵一律用 bigint 自增,不管寫(xiě)不寫(xiě)20,永遠(yuǎn)不會(huì)出現(xiàn)主鍵溢出的問(wèn)題,這是行業(yè)規(guī)范。
? 3. 主鍵自增的邏輯完全相同
兩種寫(xiě)法的 AUTO_INCREMENT 自增規(guī)則沒(méi)有任何差異:
- 插入數(shù)據(jù)時(shí),不用手動(dòng)賦值id,數(shù)據(jù)庫(kù)自動(dòng)從1開(kāi)始+1遞增
- 刪數(shù)據(jù)不會(huì)回滾自增序列,比如刪了id=10的數(shù)據(jù),下次新增還是11
- 批量插入、主鍵回填等功能,兩者表現(xiàn)一致
三、補(bǔ)充:為什么會(huì)有bigint(20)這種寫(xiě)法?【歷史原因+規(guī)范】
這個(gè)寫(xiě)法不是沒(méi)用的,而是有由來(lái)的,也是團(tuán)隊(duì)開(kāi)發(fā)里的「約定俗成」,兩種常見(jiàn)場(chǎng)景:
? 1. 歷史遺留的「規(guī)范寫(xiě)法」
MySQL 官方對(duì)各類(lèi)數(shù)值類(lèi)型的默認(rèn)顯示寬度做了規(guī)定:
tinyint→ 默認(rèn)tinyint(4)smallint→ 默認(rèn)smallint(6)int→ 默認(rèn)int(11)bigint→ 默認(rèn)bigint(20)
很多老程序員/公司的建表規(guī)范里,會(huì)手動(dòng)把默認(rèn)寬度寫(xiě)上,比如 int(11)、bigint(20),目的是「代碼可讀性更好」,團(tuán)隊(duì)里所有人一看就知道是標(biāo)準(zhǔn)的數(shù)值類(lèi)型,僅此而已。
? 2. 區(qū)分「有符號(hào)/無(wú)符號(hào)」的視覺(jué)暗示
MySQL 中 int(11) 是有符號(hào)的默認(rèn)寬度,int(10) 一般是無(wú)符號(hào)的默認(rèn)寬度;
同理 bigint(20) 是有符號(hào)的默認(rèn)寬度,bigint(19) 是無(wú)符號(hào)的默認(rèn)寬度。
手動(dòng)寫(xiě)上寬度,團(tuán)隊(duì)成員能一眼看出字段的符號(hào)屬性,是一種「開(kāi)發(fā)默契」。
四、延伸:這2個(gè)坑千萬(wàn)別踩!(99%新手必犯)
結(jié)合你的場(chǎng)景是「主鍵自增」,我把和這個(gè)問(wèn)題相關(guān)的高頻錯(cuò)誤寫(xiě)法+避坑點(diǎn)一起寫(xiě)給你,都是生產(chǎn)環(huán)境踩過(guò)的坑,看完直接避坑:
? 坑1:以為bigint(10)比bigint(20)存的數(shù)字少
錯(cuò)! 顯示寬度不影響取值范圍,bigint(1) 和 bigint(20) 存的數(shù)字范圍完全一樣,都是8字節(jié)的bigint,只是展示格式不同。
? 坑2:主鍵自增列加了DEFAULT NULL
id bigint(20) AUTO_INCREMENT DEFAULT NULL PRIMARY KEY -- ? 語(yǔ)法報(bào)錯(cuò)
MySQL 硬性規(guī)則:AUTO_INCREMENT 必須搭配 NOT NULL,自增主鍵永遠(yuǎn)不會(huì)為空,寫(xiě)了DEFAULT NULL會(huì)直接報(bào)錯(cuò) Incorrect column specifier for column 'id'。
? 正確的2種主鍵自增寫(xiě)法(都可以,生產(chǎn)通用)
-- 寫(xiě)法1:簡(jiǎn)寫(xiě)(推薦,簡(jiǎn)潔) `id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID', -- 寫(xiě)法2:規(guī)范寫(xiě)法(團(tuán)隊(duì)常用,可讀性強(qiáng)) `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID',
五、拓展:ZEROFILL零填充的實(shí)際使用(唯一用到顯示寬度的場(chǎng)景)
前面說(shuō)過(guò),顯示寬度只有搭配 ZEROFILL 時(shí)才有實(shí)際效果,給你舉個(gè)例子,幫你徹底理解,這個(gè)功能偶爾會(huì)用到(比如生成訂單號(hào)、編號(hào)):
-- 創(chuàng)建測(cè)試表,給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('測(cè)試1'),('測(cè)試2'),('測(cè)試100');
-- 查詢(xún)結(jié)果
SELECT * FROM test;查詢(xún)出來(lái)的id是這樣的:
id name 000001 測(cè)試1 000002 測(cè)試2 000100 測(cè)試100
? 效果:自動(dòng)補(bǔ)0到指定的顯示寬度6位,但底層存儲(chǔ)的還是數(shù)字1、2、100,只是展示的時(shí)候補(bǔ)了0,對(duì)業(yè)務(wù)邏輯無(wú)影響。
? 最終總結(jié)(一句話搞定,看完就懂)
bigint和bigint(20)無(wú)功能區(qū)別,都是8字節(jié)的長(zhǎng)整型,主鍵自增邏輯一致,存儲(chǔ)一致,取值范圍一致;唯一區(qū)別是顯示寬度,bigint是默認(rèn)的20位寬度,bigint(20)是手動(dòng)指定,開(kāi)發(fā)中用哪個(gè)都可以。
? 開(kāi)發(fā)選型建議
- 個(gè)人開(kāi)發(fā)/快速建表:用
bigint即可,簡(jiǎn)潔高效; - 團(tuán)隊(duì)開(kāi)發(fā)/公司規(guī)范:用
bigint(20),符合行業(yè)約定,可讀性更好; - 所有業(yè)務(wù)表主鍵:一律用 bigint 自增,別用int,避免數(shù)據(jù)量上來(lái)主鍵溢出。
這是MySQL的基礎(chǔ)核心知識(shí)點(diǎn),很多程序員工作好幾年都沒(méi)搞懂,現(xiàn)在徹底搞懂了,以后寫(xiě)建表語(yǔ)句再也不會(huì)糾結(jié)了??
到此這篇關(guān)于mysql的bigint 和 bigint(20) 主鍵自增的區(qū)別的文章就介紹到這了,更多相關(guān)mysql bigint 和 bigint(20) 主鍵自增內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL中TINYINT、INT 和 BIGINT的具體使用
- MySQL中BIGINT數(shù)據(jù)類(lèi)型如何存儲(chǔ)整數(shù)值
- Mysql數(shù)據(jù)庫(kù)中datetime、bigint、timestamp來(lái)表示時(shí)間選擇,誰(shuí)來(lái)存儲(chǔ)時(shí)間效率最高
- mysql中int、bigint、smallint 和 tinyint的區(qū)別詳細(xì)介紹
- mysql自增navicat_navicat如何設(shè)置主鍵自增
- MySQL AUTO_INCREMENT 主鍵自增長(zhǎng)的實(shí)現(xiàn)
- Mysql中實(shí)現(xiàn)修改主鍵自增值
- MySQL主鍵自增會(huì)遇到的坑及解決方法
- MySQL中的主鍵自增機(jī)制詳情
- 解決mysql的int型主鍵自增問(wèn)題
相關(guān)文章
MySQL?8.0版本配置my.cnf?/?my.ini各項(xiàng)配置示例詳解
在MySQL 8.0版本之前,MySQL使用的是名為my.ini的配置文件來(lái)配置數(shù)據(jù)庫(kù)服務(wù)器,這篇文章主要介紹了MySQL?8.0版本配置my.cnf?/?my.ini各項(xiàng)配置的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
mysql的docker容器如何設(shè)置默認(rèn)的數(shù)據(jù)庫(kù)技巧詳解
這篇文章主要為大家介紹了mysql的docker容器如何設(shè)置默認(rèn)的數(shù)據(jù)庫(kù)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
windows版本下mysql的安裝啟動(dòng)和基礎(chǔ)配置圖文教程詳解
本文通過(guò)圖文并茂的形式給大家介紹了windows版本下mysql的安裝啟動(dòng)和基礎(chǔ)配置圖文教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
MySQL5.7中的sql_mode默認(rèn)值帶來(lái)的坑及解決方法
這篇文章主要介紹了MySQL5.7中的sql_mode默認(rèn)值帶來(lái)的坑及解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
MySQL數(shù)據(jù)庫(kù)10秒內(nèi)插入百萬(wàn)條數(shù)據(jù)的實(shí)現(xiàn)
假設(shè)現(xiàn)在我們要向mysql插入500萬(wàn)條數(shù)據(jù),如何實(shí)現(xiàn)高效快速的插入進(jìn)去?本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-10-10
MySQL之復(fù)合查詢(xún)使用及說(shuō)明
文章講解了SQL復(fù)合查詢(xún)中emp、dept、salgrade三張表的使用,涵蓋多表連接、自連接、子查詢(xún)(單行/多行/多列)及合并查詢(xún)(UNION/UNION ALL)等技術(shù),通過(guò)實(shí)際案例展示如何實(shí)現(xiàn)員工與部門(mén)數(shù)據(jù)的關(guān)聯(lián)分析、條件篩選和統(tǒng)計(jì)功能2025-09-09
新手把mysql裝進(jìn)docker中碰到的各種問(wèn)題
這篇文章主要給大家介紹了新手第一次把mysql裝進(jìn)docker中可能碰到的各種問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
深入mysql外鍵關(guān)聯(lián)問(wèn)題的詳解
本篇文章是對(duì)mysql外鍵關(guān)聯(lián)問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

