先上結論:
int字段的長度與你存儲的數據長度無關
,與顯示有關
char字段的長度與你存儲數據長度有關
數據庫
先介紹int,首先看下面的這張表學習
CREATE TABLE `test10` ( `id` int(10) NOT NULL AUTO_INCREMENT, `num1` int(3) DEFAULT NULL, `num2` int(6) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
新手:num1字段,能存儲最大長度爲3的整形.net
很差意思錯了
,int類型的存儲大小爲4個字節,一個字節8位,也就是2^32 。 int的取值範圍(-2147483648 ~ 2147483647),最大能表示長度爲10的數code
在數據庫中的int無論後面填的長度爲多少,只要在int的取值範圍內,都可以將你的存儲的數正常放入。這就引來疑問了,那設置長度的意義是什麼呢。blog
來看看官網的解釋get
「MySQL還支持選擇在該類型關鍵字後面的括號內指定整數值的顯示寬度(例如,INT(4))。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。顯示寬度並不限制能夠在列內保存的值的範圍,也不限制超過列的指定寬度的值的顯示。「
這是官網的解釋,意思就是位數不知足時,自動補充0,但不影響存儲。test
實踐是檢驗真理的惟一標準。select
insert into test10 (num1,num2) values('1','10');
看結果數據類型
select * from test10 +----+------+------+ | id | num1 | num2 | +----+------+------+ | 3 | 1 | 10 | +----+------+------+ 1 row in set (0.01 sec)
發現並無對咱們剛剛插入的數據進行補齊,根據num1(3),num(6),按理說num1=001,num2=000010。im
網上查了一下,知道原來是zerofill這個屬性,沒有加上
CREATE TABLE `test10` ( `id` int(10) NOT NULL AUTO_INCREMENT, `num1` int(3) DEFAULT NULL, #少了zerofill屬性 `num2` int(6) DEFAULT NULL, #少了zerofill屬性 PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
修改以後
`test10` ( `id` int(10) NOT NULL AUTO_INCREMENT, `num1` int(3) unsigned zerofill DEFAULT NULL, `num2` int(6) unsigned zerofill DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
查詢
select * from test10; +----+------+--------+ | id | num1 | num2 | +----+------+--------+ | 3 | 001 | 000010 | +----+------+--------+ 1 row in set (0.01 sec)
補齊成功。
這下算是真正瞭解了int字段長度的含義了!
接着介紹char ,看下面這張表
CREATE TABLE `test20` ( `id` int(10) NOT NULL AUTO_INCREMENT, `char1` char(3) DEFAULT NULL, `char2` char(6) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
這時新手又會說了:既然int字段的長度不影響存儲數據的大小,那麼char也應該同樣了。很差意思又錯了
,char的取值範圍爲1~255個字節,每一個漢字3個字節。
無論如何我們先來按先前的操做來試驗一遍好了
insert into test20 (char1,char2) values ('abcd','abcd');
看結果
select * from test20; +----+-------+-------+ | id | char1 | char2 | +----+-------+-------+ | 4 | a | b | +----+-------+-------+ 1 row in set (0.01 sec)
能夠發現咱們插入小於定義的長度,能夠正常插入而且顯示出來。那麼插入比定義的長度大,會發生什麼呢,讓咱們來試一試。
insert into test20 (char1,char2) values ('abcd','abcd'); ERROR 1406 (22001): Data too long for column 'char1' at row 1
能夠看到,char1插入的‘abcd',比咱們定義的數據要長,因此報錯了。
有一點要提的是,char(6)若是你只存了‘abc’這樣3位數據,它所佔的存儲空間仍是6位的,多出來的三位會設置爲空字符,這和varchar是有區別的。
那麼就能夠得出結論了,char定義的字段長度,是和要存儲的數據長度有關係的。
若是要想了解一下各個字段類型的說明能夠看下字段數據類型
正好碰到zerofill這個屬性,那麼就學習一下
zerofill屬性的做用
一、插入數據時,當該字段的值的長度小於定義的長度時,會在該值的前面補上相應的0二、zerofill默認爲int(10)三、當使用zerofill 時,默認會自動加unsigned(無符號)屬性,使用unsigned屬性後,數值範圍是原值的2倍,例如,有符號爲-128~+127,無符號爲0~256。