【mysql】整數類型
整數類型
1. 類型介紹
整數類型一共有 5 種,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。
它們的區別如下表所示:
舉例1:
CREATE TABLE test_int1( f1 TINYINT, f2 SMALLINT, f3 MEDIUMINT, f4 INTEGER, f5 BIGINT ); DESC test_int1;
INSERT INTO test_int1(f1) VALUES(12), (-12), (-128), (127) SELECT * FROM test_int1;
當超出給定的范圍時,就會出錯
在Mysql為5.7時,可以看到生成的類型都有默認值,如:tinyint(4) 表示的是在 tinyint 范圍內 -128~127 的符號位是4位(符號+數字位數),所以默認數據的寬度為 4 ,其他同上。
2. 可選屬性
整數類型的可選屬性有三個:
2.1 M
INT(M): M表示顯示寬度,M的取值范圍是(0, 255)。例如,int(5):當數據寬度小于5位的時候在數字前面需要用字符填滿寬度。該項功能需要配合“ZEROFILL”使用,表示用“0”填滿寬度,否則指定顯示寬度無效。
如果設置了顯示寬度,那么插入的數據寬度超過顯示寬度限制,會不會截斷或插入失敗?
答案:不會對插入的數據有任何影響,還是按照類型的實際寬度進行保存,即顯示寬度與類型可以存儲的值范圍無關。從Mysql 8.0.17開始,整數數據類型不推薦使用顯示寬度屬性。
案例說明:
CREATE TABLE test_int2( f1 INT, f2 INT(5), f3 INT(5) ZEROFILL ) INSERT INTO test_int2(f1,f2) VALUES(123,123),(123456,123456); SELECT * FROM test_int2;
插入數據,當數值超過了 int(5) 給定的長度時,仍然沒有報錯
這是因為INT(5)給定的只是顯示寬度,并不會影響對 int 本身的范圍
INT(5) 只有配合 ZEROFILL 一起使用才有意義,如:對 f3 賦值
INSERT INTO test_int2(f3) VALUES(123), (123456); SELECT * FROM test_int2;
當使用 ZEROFILL 時,當不足給定的位數時,補充 0 充當位數
① 顯示寬度為5。當insert的值不足5位時,使用0填充。
②當使用ZEROFILL時,自動會添加UNSIGNED
SHOW CREATE TABLE test_int2;
整型數據類型可以在定義表結構時指定所需要的顯示寬度,如果不指定,則系統為每一種類型指定默認的寬度值。
舉例2
CREATE TABLE test_int11 ( x TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );
查看表結構 (MySQL5.7中顯式如下,MySQL8中不再顯式范圍)
mysql> desc test_int11; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | x | tinyint(4) | YES | | NULL | | | y | smallint(6) | YES | | NULL | | | z | mediumint(9) | YES | | NULL | | | m | int(11) | YES | | NULL | | | n | bigint(20) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
TINYINT有符號數和無符號數的取值范圍分別為-128 ~ 127和0~255,由于負號占了一個數字位,因此TINYINT默認的顯示寬度為4。同理,其他整數類型的默認顯示寬度與其有符號數的最小值的寬度相同。
2.2 UNSIGNED
UNSIGNED: 無符號類型(非負),所有的整數類型都有一個可選的屬性UNSIGNED(無符號屬性),無符號整數類型的最小取值為0。所以,如果需要在MySQL數據庫中保存非負整數值時,可以將整數類型設置為無符號類型。
int類型默認顯示寬度為int(11),無符號int類型默認顯示寬度為int(10)。
CREATE TABLE test_int3( f1 INT UNSIGNED ); mysql> desc test_int3; +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+ | f1 | int(10) unsigned | YES | | NULL | | +-------+------------------+------+-----+---------+-------+ 1 row in set (0.00 sec)
2.3 ZEROFILL
ZEROFILL: 0填充,(如果某列是ZEROFILL,那么MySQL會自動為當前列添加UNSIGNED屬性),如果指定了ZEROFILL只是表示不夠M位時,用0在左邊填充,如果超過M位,只要不超過數據存儲范圍即可。
原來,在 int(M) 中,M 的值跟 int(M) 所占多少存儲空間并無任何關系。 int(3)、int(4)、int(8) 在磁盤上都是占用 4 bytes 的存儲空間。也就是說,int(M),必須和UNSIGNED ZEROFILL 一起使用才有意義。 如果整數值超過M位,就按照實際位數存儲。只是無須再用字符 0 進行填充。
3. 適用場景
TINYINT:一般用于枚舉數據,比如系統設定取值范圍很小且固定的場景。
SMALLINT:可以用于較小范圍的統計數據,比如統計工廠的固定資產庫存數量等。
MEDIUMINT:用于較大整數的計算,比如車站每日的客流量等。
INT、INTEGER:取值范圍足夠大,一般情況下不用考慮超限問題,用得最多。比如商品編號。
BIGINT:只有當你處理特別巨大的整數時才會用到。比如雙十一的交易量、大型門戶網站點擊量、證券公司衍生產品持倉等。
4. 如何選擇?
在評估用哪種整數類型的時候,需要考慮存儲空間和可靠性的平衡問題:一方面,用占用字節數少的整數類型可以節省存儲空間;另一方面,要是為了節省存儲空間, 使用的整數類型取值范圍太小,一旦遇到超出取值范圍的情況,就可能引起系統錯誤,影響可靠性。
舉個例子,商品編號采用的數據類型是 INT。原因就在于,客戶門店中流通的商品種類較多,而且,每天都有舊商品下架,新商品上架,這樣不斷迭代,日積月累。
如果使用 SMALLINT 類型,雖然占用字節數比 INT 類型的整數少,但是卻不能保證數據不會超出范圍 65535。相反,使用 INT,就能確保有足夠大的取值范圍,不用擔心數據超出范圍影響可靠性的問題。
要注意的是,在實際工作中,系統故障產生的成本遠遠超過增加幾個字段存儲空間所產生的成本。因此,建議首先確保數據不會超過取值范圍,在這個前提之下,再去考慮如何節省存儲空間。
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。