今天在建MySQL表的時候突然想弄清楚
- int(11)的含義。
- 為什么括號中的數字大多數情況都是11而不是其他數字。
int(11)的含義
0、先建一張表,順便插入一些數值
create table `account`(
`id` int(3)
)engine = innodb default charset=utf8;
insert into `account`(`id`) values(12);
select * from `account`;
1、然后我們看看此時表的結構和表中數據
2、將【Zerofill】勾選上,看看表中數據
圖中的數據剛好展示了3位,和我們的int(3)中的3符合。
3、改變表中的int(n)中n的值,並保持zerofill勾選,看結果
alter table `account` change `id` `id` int(5) zerofill;
圖中數據展示了5位,和int(n)中n的值的位數是一樣的
4、如果現在插入超過int(n)中n位數的數據(比如說6位數)呢?數據會不會丟失?
insert into `account`(`id`) values(123456);
select * from `account`;
答案是:依然會展示插入的數據,不會丟失數據
5、如果插入超過int類型的上限的數呢?
我們知道MySQL中的int是占4個字節,每個字節8位,一共就是32位。
而且上面勾選了【Unsigned】,也就是無符號數,那么int的取值最大就可以取到
2^32 - 1 = 4294967295,我們把這個值插進去看看結果
insert into `account`(`id`) values(4294967295);
insert into `account`(`id`) values(4294967296);
6、結論
通過以上幾點,我們可以推斷:
- int(n)中的n就是數據展示的位數(長度)。但是這樣說不夠精確:
1. 在沒開啟【zerofill】的情況下,不管是幾位數,只要不超過int類型的上限,都直接顯示數據。
2. 在開啟【zerofill】的情況下,n的數值是展示的數據的位數的下限。位數不夠n位數,則高位補0;位數夠了也不會損失數據,直接顯示插入的數據。
3. 超過int類型上限的數是無法插入數據庫表中的。
為什么括號中的數字大多數情況都是11而不是其他數字?
因為int類型的數據上限是2^32 - 1 = 4294967295
,這個數值剛好10位數,超過這個數值的數無法插入數據庫表中,自然也就無法展示,所以選擇超過10的n值就沒有太大意義。
所以我們選擇11位的展示長度肯定是夠用了,(實際上寫10就夠用的),除此之外可能就是習慣了,但是具體的n取多少還是根據具體情況而定。