mysql中int類型的寬度M解析
一直以來在MYSQL建表的時(shí)候都有一個(gè)困惑夷蚊,那就是關(guān)于int類型课蔬。int(M)這個(gè)M代表什么议经?
比如我定義一個(gè)文章的主鍵news_id為int(8)為什么要定義為8甥厦?如果我存儲(chǔ)一個(gè)位數(shù)為10的數(shù)3445667788出牧,發(fā)現(xiàn)實(shí)際也是可以存儲(chǔ)的掘宪。于是查看mysql的手冊蛾扇,發(fā)現(xiàn)有這樣一段話:M指示最大顯示寬度。最大有效顯示寬度是255魏滚。顯示寬度與存儲(chǔ)大小或類型包含的值的范圍無關(guān)镀首。
20160910095319195.jpg
20160910095404399.jpg
顯示寬度,我們可以理解為所存儲(chǔ)數(shù)值的位數(shù)鼠次。比如我設(shè)置news_id為int(8)更哄,是告訴mysql我要存儲(chǔ)的數(shù)值的最大位數(shù)是個(gè)8位數(shù),但是如果存儲(chǔ)的超過8位數(shù)腥寇,只要在int類型允許的范圍內(nèi)(signed類型-21474836482147483647成翩,unsigned類型04294967295)也是可以存儲(chǔ)的。比如:
從上面兩個(gè)圖可以看出赦役,我存儲(chǔ)了一個(gè)超過8位數(shù)的int類型數(shù)據(jù)麻敌,還是能夠正常顯示的。那么問題又來了扩劝,這個(gè)M既然只要我能保證在所屬范圍之內(nèi)庸论,我是不是可以隨意去定義了,當(dāng)然不是的棒呛。首先設(shè)置M肯定要跟實(shí)際的業(yè)務(wù)數(shù)據(jù)相關(guān)聂示,多設(shè)置浪費(fèi)存儲(chǔ)空間。另外如果你設(shè)置了填充0簇秒,zerofill的話就可以看出一些端倪鱼喉。
我們把news_id的寬度設(shè)置為3,然后再查看下看看:
20160910100221368.jpg
我們看到值為1的左端填充了0,原來默認(rèn)為0的變成了000.所以如果M設(shè)置為某個(gè)值扛禽,并且設(shè)置了zerofill的話锋边,當(dāng)存儲(chǔ)的長度小于M的話,會(huì)自動(dòng)填充0.所以有時(shí)項(xiàng)目里確實(shí)需要存儲(chǔ)類似于001,002...的值時(shí)编曼,這個(gè)M的設(shè)置要符合業(yè)務(wù)需求豆巨。對于tinyint,mediumint,bigint等一樣的理解掐场。
相比較來說往扔,char(n)和varchar(n)類型的這個(gè)n代表實(shí)際的存儲(chǔ)長度,超過了會(huì)被mysql截掉熊户。還是有所區(qū)別的萍膛。