老司機深入虎穴探索Mysql中int(1)、int(10)、int(11)的區別是什麼?

在上一篇原創文章MySQL一個表的自增id用完了,背井大佬讓我用這些姿勢再往裏插數據,最後留下了一個問題,大家知不知道int(1)和int(11)有什麼區別,沒有小夥伴互動回答,只有一位老哥讓我說一下什麼區別,我說上週安排,這不就打臉了,如果這位老哥能看到的話,說聲抱歉,然後今天特地用這篇文章來回答這個問題。我相信一定會對有些小夥伴有所幫助。

看過上篇文章你一定知道了字段後面的unsigned是什麼意思,其實就是很簡單的基礎,但是我見過有很多5年以上的開發人員不知道unsigned作用是什麼。包括今天要講的zerofill,不知道的人就更多了,我們太習慣舒適了,我們總是自嘲自己是CRUD程序員,可這種自嘲更多的是羣嗨,有幾個真正戳痛過自己。好了,點到爲止,只是希望我們不要停止學習,不要埋葬探索的慾望。

回到正題,你在建字段id時,選擇了int類型之後,後面的長度你習慣性的填上10或者11,你又建了一個type字段,選擇了int之後,你又習慣性的在長度上填了1,很佩服大家如此的統一有默契。問其緣由,id自增長啊,肯定要長度長一點了,type一般就幾個意思,長度爲1就夠了,我想如果tinyint會說話的話,一定會跳起來打你膝蓋,咋地,質問你是看不起它還是咋地?

我不知道現在怎樣,以前這種思想誇張點說真的是普遍現象,所有人都這麼幹,那麼你真的用對了嗎?下面,我們一起來揭開int(1)、int(10)、int(11)它們一點兒也不神祕的面紗。

1、我們先隨便建一張表,定義幾個字段,如下圖所示:

DROP TABLE IF EXISTS mzc;

2、眼尖的小夥伴應該也發現了這些字段都是int類型,只不過後面跟着不同的屬性修飾,上一篇unsigned我就不囉嗦了,這次有的int後面多了個zerofill,就是下圖複選框打鉤的填充零,這是什麼意思呢?

image

3、彆着急,我們向表裏插一條數據。

INSERT INTO `mzc`(`id`, `seq`, `val`, `num`, `sort`, `no`) VALUES (1, -12, 4567, 1, 1, 1);

4、你們猜,執行select * 之後是什麼樣?

SELECT * FROM mzc;

5、別走神,高潮要來了,我們來一探到底。

image

咦、sort和no的值怎麼前面填充了那麼多0,我的天吶,這麼神奇的嗎?是不是和有些小夥伴想的不一樣?

6、別泄氣,再堅持一下,就用你們設想的姿勢,我們給num插一個長度爲10的值,就10個9吧,夠大了吧?

INSERT INTO `mzc`(`id`, `seq`, `val`, `num`, `sort`, `no`) VALUES (2, -12, 4567, 9999999999, 1, 1);

你們猜怎麼着,mysql說我耍流氓,說我太大了,超過它的承受範圍了,終究是一個人扛下了所有。

image.png

int(10)尚且如此,那有的小夥伴想插入長度11位的值該怎麼辦,我想還是死了這條心吧,下車冷靜冷靜,是時候真正瞭解int(1)、int(10)、int(11)了。

我們來看一下Mysql手冊上是怎麼介紹的:

int(M): M indicates the maximum display width for integer types.1

這句話的意思就是:在 integer 數據類型中,M 表示最大顯示寬度。

也就是說:

  • int(M)中,M的值與int(M)所佔多少存儲空間沒有任何關係,int(1)、int(10)、int(11) 在磁盤上都是佔用 4 btyes 的存儲空間。

  • 與int類型的字段能存儲的數據最大最小值也沒有任何關係,int類型的字段能存儲的數據上限還是2147483647(有符號型)和4294967295(無符號型)。

這張圖再發一遍,希望可以加深大家的印象。

image

回到我們第一次insert時候查詢結果的截圖:

image

可以發現,int(10)與int(11)後的括號中的字符表示顯示寬度,用於顯示寬度小於指定的列寬度的值時從左側填滿寬度,比如我們定義了int(10),插入1,在1左側補充9個0,最後顯示0000000001,int(11)同理。如果顯示寬度大於指定列寬就正常顯示,如果int(3),插入1,會顯示001,插入了4567,還是顯示4567。

總結

  • int(1)、int(10)和int(11)本身是沒有任何區別的,只有使用了zerofill之後,纔會有顯示寬度上的區別。

  • 聲明整型數據列時,我們可以爲它指定顯示寬度M(1~255),理論最大顯示寬度爲255。

  • 如果爲一個數值列指定ZEROFILL,MySQL自動爲該列添加UNSIGNED屬性。

上次留言的那位老哥,不知你有沒有看到這篇文章,雖遲但到,希望沒有辜負你的信任。如果這篇文章能幫一些小夥伴掃盲,那也算是幸事一件了,希望可以幫忙轉發、在看,給點鼓勵和支持!謝謝!

最後,因爲文中開了點車,所以特地發另一篇文章,幫大家洗洗眼,感興趣的話可以去第二篇文章讀一讀,句子很短,卻充滿故事和想象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章