最近在找工作所以一直在面試,在面試過(guò)程中暴露了自己很多不足的地方,一直在總結(jié)和歸納。可能大部分面試官對(duì) mysql 的問(wèn)題都會(huì)問(wèn)數(shù)據(jù)庫(kù)優(yōu)化啊、主從復(fù)制啊、索引啊、引擎啊等等之類的。那么使我印象最深的是 int (10) 和 int (11) 有什么區(qū)別。這好像是最基礎(chǔ)的問(wèn)題了,我好像從來(lái)沒有在意過(guò)。當(dāng)時(shí)有點(diǎn)兒懵逼,有什么區(qū)別?不知道!沒想過(guò)!
那么回到家以后,我趕緊復(fù)習(xí)了下 mysql 的數(shù)據(jù)類型相關(guān)知識(shí)。對(duì)整數(shù)類型做些說(shuō)明。
mysql 中整數(shù)數(shù)據(jù)類型
數(shù)據(jù)類型 | 說(shuō)明 | 存儲(chǔ)需求 |
---|---|---|
tinyint | 很小的整數(shù) | 1 字節(jié) |
smallint | 小的整數(shù) | 2 字節(jié) |
mediumint | 中等大小的整數(shù) | 3 字節(jié) |
int(Integer) | 普通大小的整數(shù) | 4 字節(jié) |
bigint | 大整數(shù) | 8 字節(jié) |
不同類型的取值范圍
數(shù)據(jù)類型 | 有符號(hào) | 無(wú)符號(hào) |
---|---|---|
tinyint | -128~127 | 0~255 |
smallint | -32768~32767 | 0~65535 |
mediumint | -8388608~8388607 | 0~16777215 |
int(integer) | -2147483648~2147483647 | 0~4294967295 |
bigint | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
不同數(shù)據(jù)類型的默認(rèn)顯示寬度
數(shù)據(jù)類型 | 默認(rèn)顯示寬度 |
---|---|
tinyint | 4 |
smallint | 6 |
mediumint | 9 |
int(integer) | 11 |
bigint | 20 |
* 因?yàn)樨?fù)號(hào)占了一個(gè)數(shù)字位,所以各類型的寬度是最大值數(shù)字位 + 1 位。例如 tinyint 的最大數(shù)字位是 3,加負(fù)號(hào)所以顯示寬度是 4。
那么取值范圍和顯示寬度到底有什么關(guān)系呢?我利用 tinyint 做了個(gè)實(shí)驗(yàn),首先創(chuàng)建一張表如下
mysql>?desc?test_integer; +-----------+------------+------+-----+---------+----------------+ |?Field?????|?Type???????|?Null?|?Key?|?Default?|?Extra??????????| +-----------+------------+------+-----+---------+----------------+ |?id????????|?int(11)????|?NO???|?PRI?|?NULL????|?auto_increment?| |?test_id_1?|?tinyint(1)?|?NO???|?????|?NULL????|????????????????| |?test_id_2?|?tinyint(4)?|?NO???|?????|?NULL????|????????????????| +-----------+------------+------+-----+---------+----------------+ 3?rows?in?set?(0.00?sec)
我分別創(chuàng)建了有符號(hào) tinyint 類型的 test_id_1 顯示寬度為 1 和 test_id_2 顯示寬度為 4 兩字段,接下來(lái)插入數(shù)據(jù),同時(shí)插入 – 128、1 和 127 這些數(shù)值,看看會(huì)怎么樣。
mysql>?insert?into?test_integer?(test_id_1,test_id_2)?values?(-128,-128),?(1,1),?(127,127); Query?OK,?3?rows?affected?(0.00?sec) Records:?3??Duplicates:?0??Warnings:?0
ok 提示插入成功,我們查詢一下
mysql>?select?*?from?test_integer; +----+-----------+-----------+ |?id?|?test_id_1?|?test_id_2?| +----+-----------+-----------+ |??1?|??????-128?|??????-128?| |??2?|?????????1?|?????????1?| |??3?|???????127?|???????127?| +----+-----------+-----------+ 3?rows?in?set?(0.00?sec)
查詢出來(lái)的結(jié)果也是一樣,經(jīng)過(guò)以上實(shí)驗(yàn)得到結(jié)論:
顯示寬度整數(shù)類型的取值范圍是無(wú)關(guān)的。顯示寬度只是指明 mysql 最大可能顯示的數(shù)字個(gè)數(shù),數(shù)值的位數(shù)小于指定的寬度時(shí)就由空格填充,如果插入了大于顯示寬度的值,只要該值不超過(guò)該類型整數(shù)的取值范圍,數(shù)值依然可以插入,而且能夠顯示出來(lái)。
同理,所以 int (10) 和 int (11) 沒有任何區(qū)別,就是顯示寬度不同,小伙伴們千萬(wàn)不要忘記了呀。
推薦教程:《PHP教程》