1. 程式人生 > 實用技巧 >關於MySQL INT型別長度的疑惑

關於MySQL INT型別長度的疑惑

  • 疑惑一:int長度預設為11?

  • 疑惑二:int(x),x是代表數值長度?如果插入一條記錄為9位數值到int(4)型別的欄位中,插入操作能否成功?如果插入操作成功,查詢出來的值是多少?

在MySQL中關於int(x)有一個普遍的誤解,就是認為該列是可以儲存x位數字的最大數值,事實上不是這樣,int(x)不能代表可以儲存在該列的最大值,這裡的x表示的是整數列顯示的寬度,不會限制儲存數值的範圍;而字元列如char(x),varchar(x)這種,數字是表示可以儲存的字元長度;

每種整數型別所需的儲存空間和範圍 [官方文件:https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

]

[參考:https://stackoverflow.com/questions/5634104/what-is-the-size-of-column-of-int11-in-mysql-in-bytes]

ypeStorage (Bytes)Minimum Value SignedMinimum Value UnsignedMaximum Value SignedMaximum Value Unsigned
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

從上表可以看出INT是佔4個位元組大小,4Bytes -> 4 * 8 Bit ,通過換算,可以得出可以儲存一個有符號的值 -2147483648 ~ 2147483647,無符號的值 0 ~ 4294967295;對於有符號的值的長度是11位,對於無符號的值的長度是10位,多的那個一位是符號位當使用有符號展示的整數列寬頻為11位,當使用無符號展示的整數列寬頻位10位

關於int(x)的使用 [官方文件: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-attributes.html

]

MySQL 支援用括號包含的數字指定整數資料型別的顯示寬度, 比如INT(4)指定INT顯示寬度為四位數,應用程式可以使用此可選的顯示寬度來顯示整數值當該整數值的寬度小於為列指定的寬度,可用空格填充它們

顯示寬度也沒有限制,可以被儲存在列中的值的範圍內,也不會阻止寬於列顯示寬度的值正確顯示。例如,指定為的列SMALLINT(3)具有通常SMALLINT-32768-32767,並且超過三位的數字將完整顯示三位數字所允許的範圍之外的值;

如果配合ZEROFILL屬性, 將用0來補齊. 比如INT(4) ZEROFILL欄位, 數字5會被儲存為0005;

[參考:https://stackoverflow.com/questions/8892341/what-does-int5-in-mysql-mean]

除非列是UNSIGNED ZEROFILL,否則整數型別的列的顯示寬度實際上不會執行任何操作;

建立一張zerofill_demo測試

CREATE TABLE zerofill_demo (
	id INT(11) NOT NULL AUTO_INCREMENT,
	a INT(11) NOT NULL,
	b INT(11) UNSIGNED ZEROFILL NOT NULL,
	c INT(5) DEFAULT NULL,
	d INT(5) UNSIGNED ZEROFILL NOT NULL,
	e INT(15) DEFAULT NULL,
	PRIMARY KEY (`id`)
);


INSERT INTO zerofill_demo (a, b, c, d, e) VALUES (1, 1, 1, 1, 1);
INSERT INTO zerofill_demo (a, b, c, d, e) VALUES (1234567890, 1234567890, 1234567890, 1234567890, 1234567890);

  

參考:https://www.virendrachandak.com/techtalk/mysql-int11-what-does-it-means/

   https://www.jianshu.com/p/61293b416335