說下想寫這篇文章的事由。昨天開發(fā)提出的一個(gè)DBA任務(wù),深深的震驚了我,說將字段 role int(32) unsigned? 改成 role int(64) unsigned not null ,說int大小不夠用≡颈梗狂暈中。艾栋。爆存。
說明,實(shí)際上手冊(cè)上寫的很清楚的蝗砾。每個(gè)數(shù)據(jù)類型可以支持的大小终蒂。所需要的存儲(chǔ)空間是定長(zhǎng)的。
類型字節(jié)最小值最大值
(帶負(fù)號(hào)的/無負(fù)號(hào)的)(帶負(fù)號(hào)的/無負(fù)號(hào)的)
TINYINT1-128127
0255
SMALLINT2-3276832767
063335
MEDIUMINT3-83886088388607
016777215
INT4-21474836482147483647
04294967295
BIGINT8-92233720368547758089223372036854775807
018446744073709551615
整數(shù)類型后面跟的是顯示的寬度遥诉。M指示最大顯示寬度拇泣。最大有效顯示寬度是255。顯示寬度與存儲(chǔ)大小或類型包含的值的范圍無關(guān)矮锈。
實(shí)踐出真知:
mysql> create table test2 ( a int , b int(20) unsigned not null , c int(40) unsigned zerofill ) engine = innodb ;
Query OK, 0 rows affected (0.06 sec)
mysql> show create table test2;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test2 | CREATE TABLE `test2` (
`a` int(11) DEFAULT NULL,
`b` int(20) unsigned NOT NULL,
`c` int(40) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
給表插入記錄霉翔。
mysql> insert into test2 ?values(1,2000000, 34823424);
Query OK, 1 row affected (0.04 sec)
mysql> select * from test2;
+------+---------+------------------------------------------+
| a ? ?| b ? ? ? | c ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+------+---------+------------------------------------------+
| ? ?1 | 2000000 | 0000000000000000000000000000000034823424 |
+------+---------+------------------------------------------+
mysql> alter table test2 ?add d int(256) not null;
ERROR 1439 (42000): Display width out of range for column 'd' (max = 255)
從以上測(cè)試可以說明以下:
1:對(duì)于整形數(shù)據(jù)類型,數(shù)據(jù)存儲(chǔ)所占的字節(jié)數(shù)是固定長(zhǎng)度的苞笨。比如
INT[(M)] [UNSIGNED] [ZEROFILL] 债朵。
其中
M指示最大顯示寬度。最大有效顯示寬度是255瀑凝。當(dāng)插入的表的字段數(shù)據(jù)長(zhǎng)度小于設(shè)定的INT(M)最大長(zhǎng)度的時(shí)候序芦,檢索出來的數(shù)據(jù)會(huì)自動(dòng)空格補(bǔ)充。
2:zerofill(補(bǔ)零)粤咪,當(dāng)實(shí)際插入的數(shù)據(jù)長(zhǎng)度小于建表的時(shí)候設(shè)定的長(zhǎng)度時(shí)候谚中,它會(huì)從左開始補(bǔ)零。這個(gè)修飾符可以防止MySQL存儲(chǔ)負(fù)值寥枝。
3:對(duì)于建表的時(shí)候宪塔,不指定INT的顯示長(zhǎng)度,系統(tǒng)會(huì)自動(dòng)預(yù)設(shè)顯示長(zhǎng)度大小囊拜。
4:MySQL手冊(cè)很重要某筐,很權(quán)威,很基礎(chǔ)冠跷。