mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义
在一開始接觸MySQL數(shù)據(jù)庫(kù)時(shí),對(duì)于int(M)及tinyint(M)兩者數(shù)值類型后面的M值理解是最多能夠插入數(shù)據(jù)庫(kù)中的值不能大于M;
后來工作后,也是一邊學(xué)習(xí)一邊使用,之后的理解是其中的M的意思是插入數(shù)據(jù)庫(kù)中的值的字符長(zhǎng)度不能大于M,例如,int(4),想要插入1234,1234的字符長(zhǎng)度是4,就正好可以插入數(shù)據(jù)庫(kù),12341就不行,因?yàn)槭?個(gè)字符長(zhǎng)度,這也都是道聽途說,自己從來沒有驗(yàn)證過;
如今,由于面試中經(jīng)常會(huì)被問到有關(guān)數(shù)據(jù)庫(kù)方面的知識(shí),今天也想著深入了解下這個(gè)M代表的含義(上述兩個(gè)理解都是錯(cuò)誤的)。
首先,我們創(chuàng)建一個(gè)數(shù)據(jù)表test:
mysql>CREATE TABLE test(-> id1 int(1),
-> id2 tinyint(1)->);
我們給id1定義為int,并設(shè)置字符長(zhǎng)度為1,id2定義為tinyint,也設(shè)置字符長(zhǎng)度為1;
然后分別插入值127,127,結(jié)果發(fā)現(xiàn),兩者都插入到了數(shù)據(jù)表中:
mysql> INSERT INTO test(id1,id2) values(127,127);//運(yùn)行成功
結(jié)果是插入成功的,從此次測(cè)試已經(jīng)可以知道,我之前的想法都是錯(cuò)誤的,接下來我們?cè)僮鲆粋€(gè)實(shí)驗(yàn),插入數(shù)據(jù)128,128,即id=128,id2=128:
mysql> INSERT INTO test(id1,id2) values(128,128);//運(yùn)行失敗:ERROR 1264 (22003):Out of range value for column 'id2' at row 1
出錯(cuò)了,int類型的id1插入成功了,tinyint類型的id2提示超出了范圍,這是為什么呢?
首先,我們先要了解一個(gè)基礎(chǔ)知識(shí)點(diǎn),就是下面這張表:(摘自W3C教程)
上述表格中的數(shù)值類型都是定長(zhǎng)的,也就是說,無論你存的數(shù)值是多少,多大或者多小,占用的字節(jié)大小都是固定的。例如,之前設(shè)置的int(1),雖然M值是1個(gè)字符,但是它所占用的空間大小永遠(yuǎn)都是4個(gè)字節(jié)的大小,換句話說就是,你可以存入有符號(hào)整型從-2 147 483 648到2 147 483 647包括這兩個(gè)數(shù)的中間任何一個(gè)數(shù)。int(1)和int(11)占用的是4個(gè)字節(jié),可以存入上述這些數(shù),tinyint(1)和tinyint(4)占用的是1個(gè)字節(jié),可以存入從-128到127的數(shù),這也是為什么之前的一次試驗(yàn),int(1)插入128成功,而tinyint(1)插入128卻提示超出長(zhǎng)度。
那么,這個(gè)M值到底代表什么意思呢?
到這里,我們已經(jīng)可以發(fā)現(xiàn),M值即使設(shè)置為1,它也可以存入字符長(zhǎng)度大于1的值,那么,如果存入的字符長(zhǎng)度小于1會(huì)怎么樣?我們來試一試:
先將id1的類型更改為int(2),然后插入數(shù)據(jù)id1=1:
mysql> ALTER TABLE test Modify id1 int(2);mysql> INSERT INTO test(id1) values(1);//運(yùn)行成功,說明值1已經(jīng)插入到test表中
我們查詢一下表中的數(shù)據(jù),看看結(jié)果具體如何:
mysql> SELECT *FROM test;+------+
| id1 |
+------+
| 1 |
+------+
接下來,我們?cè)傩薷囊幌耰d1的填充數(shù)據(jù)類型zerofill(表示用0填充),這里先知道如何操作即可,我們?cè)購(gòu)慕Y(jié)果得出結(jié)論:
mysql> ALTER TABLE test MODIFY id1 int(2) zerofill;mysql> SELECT * FROM test;
+------+
| id1 |
+------+
| 01 |
+------+
現(xiàn)在是不是有些清楚了。我們?cè)O(shè)置的M值是2,沒有設(shè)置zerofill用0填充時(shí),對(duì)于操作沒有任何影響,而設(shè)置了zerofill后,我們可以清楚地看到值1字符數(shù)不足M值,左前位置補(bǔ)0。我們也可以將M值設(shè)置成別的大小進(jìn)行多次測(cè)試,這里就不進(jìn)行測(cè)試了。
需要強(qiáng)調(diào)的是,不同的數(shù)據(jù)類型中的M值意義是不一樣的,我們這里僅討論整型中的M值。
從上面我們可以得到如下的結(jié)論:
1、整數(shù)型的數(shù)值類型已經(jīng)限制了取值范圍,有符號(hào)整型和無符號(hào)整型都有,而M值并不代表可以存儲(chǔ)的數(shù)值字符長(zhǎng)度,它代表的是數(shù)據(jù)在顯示時(shí)顯示的最小長(zhǎng)度;
2、當(dāng)存儲(chǔ)的字符長(zhǎng)度超過M值時(shí),沒有任何的影響,只要不超過數(shù)值類型限制的范圍;
3、當(dāng)存儲(chǔ)的字符長(zhǎng)度小于M值時(shí),只有在設(shè)置了zerofill用0來填充,才能夠看到效果,換句話就是說,沒有zerofill,M值就是無用的。
總結(jié):int(11),tinyint(1),bigint(20),后面的數(shù)字,不代表占用空間容量。而代表最小顯示位數(shù)。這個(gè)東西基本沒有意義,除非你對(duì)字段指定zerofill。
所以我們?cè)谠O(shè)計(jì)mysql數(shù)據(jù)庫(kù)時(shí),建表時(shí),mysql會(huì)自動(dòng)分配長(zhǎng)度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
所以,就用這些默認(rèn)的顯示長(zhǎng)度就可以了。不用再去自己填長(zhǎng)度,比如搞個(gè)int(10)、tinyint(1)之類的,基本沒用。而且導(dǎo)致表的字段類型多樣化。
參考博客:http://www.cnblogs.com/stringzero/p/5707467.html
總結(jié)
以上是生活随笔為你收集整理的mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国移动 7 月移动客户净增 61.4
- 下一篇: 因旗下 SSD 质量问题,西部数据面临超