前兩天和朋友閑聊,聊到了數據庫設計相關的問題,朋友突然畫風一轉--為什么數據庫里面int最大長度只能int(11),long最大長度只能bigint(20)?為什么int(4)可以存下999999?
我當時的回答有點含糊--int類型4字節,4*8=32bit,2^32-1是11位吧! int(*)里面的*並非數字的長度吧!(有點心虛qwq...)
事后想起了這件事,用計算器算了下2^ 32-1,結果居然是4294967295,只有十位啊??? 當時覺得應該是某個環節弄錯了,肯定是(自信滿滿..) 突然注意到建表語句中的unsigned(無符號的)這個單詞,恍然大悟,還有符號位(+/-),正好11位.
我比較在意的是后面一個問題,為什么int(4)可以存下999999,難道像varchar一樣是一種可變長度的類型.我覺得問題不會這么簡單,於是借助強大的瀏覽器搜索了一下,終於弄明白了到底是怎么回事.
這里我把查到的資料整理一下
下圖是來自詳解mysql int類型的長度值問題
從上圖可以看出來:sql每種整形類型的取值范圍及最大長度
另外,int(*)都可以存儲上述范圍的數字,也就是說int(1)和int(11)都能存儲上述范圍內的數字.(注意有無符號范圍不一樣)
具體的區別就是,用int(11)存儲32,數據庫會在前面補滿0.要查看出不同效果可以在創建類型的時候加 zerofill這個值,表示用0填充,否則看不出效果的。