最近在網(wǎng)上看到一篇關(guān)于int(3)和int(11)區(qū)別的帖子,我第一反應(yīng)這不就是它們之間主要涉及存儲整型數(shù)據(jù)時(shí)所需的位數(shù),即3位和11位的差異。然而,經(jīng)過詳細(xì)閱讀文章并進(jìn)行進(jìn)一步的資料查詢和測試后,我才發(fā)現(xiàn)我一直以來對于int(3)的理解存在誤差。今天,我打算與家人分享這一新的認(rèn)識。
mysql-int.jpg
首先,需要明確的是,int(3)和int(11)都是表示整數(shù)類型,而不是定義整數(shù)的存儲長度。在MySQL中,INT類型占據(jù)4個字節(jié)(32位),可以存儲范圍是-2^31到2^31-1(約-2.1億到2.1億),這個范圍是固定的,不受括號中數(shù)字的影響。
int(3)和int(11) 區(qū)別在于顯示寬度的影響。當(dāng)我們定義一個字段為int(3)時(shí),這個數(shù)字表示的是在使用ZEROFILL填充字符時(shí)的顯示寬度,而不是實(shí)際存儲的整數(shù)位數(shù)。使用ZEROFILL會在數(shù)字不足指定寬度時(shí),在前面用零進(jìn)行填充。
我們可以在mysql(5.7)中創(chuàng)建數(shù)據(jù)查看下具體的效果:
創(chuàng)建表:
CREATE TABLE `int_test1` ( `int_3` int(3) , `int_11` int(11) , `int_zf_3` int(3) ZEROFILL , `int_zf_11` int(11) ZEROFILL );添加數(shù)據(jù):
INSERT INTO int_test1(int_3,int_11,int_zf_3,int_zf_11) VALUES (1,1,1,1),(2365,2365,2365,2365);查看數(shù)據(jù):
圖片
_20240127224156.jpg
可以看到,int() 括號中的數(shù)字是在位數(shù)不足時(shí)如果使用ZEROFILL的話會在前面用零進(jìn)行填充,補(bǔ)齊到括號中數(shù)字的位數(shù)。
因?yàn)閆EROFILL屬性只適用于非負(fù)整數(shù)。所以當(dāng)我們插入負(fù)數(shù)時(shí)會報(bào)錯。
圖片
我們打開表的DDl,就可以看到,我們設(shè)置ZEROFILL的時(shí)候他會自動設(shè)置為unsigned(無符號)
圖片
我們在實(shí)際生產(chǎn)環(huán)境使用查詢的時(shí)候通常要把數(shù)據(jù)庫的int數(shù)據(jù)轉(zhuǎn)化為java對象的Integer,所以ZEROFILL在實(shí)際生產(chǎn)中使用的很少,其次我們需要給數(shù)據(jù)補(bǔ)齊位數(shù)的時(shí)候通常是在程序中做處理,不會依賴數(shù)據(jù)庫,這樣我們的業(yè)務(wù)才能更靈活。
在數(shù)據(jù)庫設(shè)計(jì)中,INT(3)和INT(11)的區(qū)別主要在于它們控制輸出時(shí)的顯示寬度。實(shí)際的存儲大小是相同的,都占用4個字節(jié)。而括號中的數(shù)字在非ZEROFILL的情況下,只是指定了輸出時(shí)的最小寬度,不足時(shí)會用空格填充。在ZEROFILL的情況下,還會影響零填充的總寬度。因此,在選擇使用INT(3)還是INT(11)時(shí),主要考慮的是對數(shù)據(jù)的顯示控制需求。
本文鏈接:http://m.www897cc.com/showinfo-26-70479-0.html你對MySQL的int(11)真的了解嗎?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com