在 mysql 數據庫的使用中,我們常常指定數據庫表的字段的類型為整型int和可變字符串varchar,如下面一段 ddl (Data Definition Language)語法:
CREATE TABLE `test` (
`id` bigint NOT NULL AUTO_INCREMENT,
`age` int(5) DEFAULT NULL,
`age1` int DEFAULT NULL,
`name` varchar(5) DEFAULT NULL,
`name1` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
針對varchar(n)很多人都知道,n是指字符串長度,我們先實驗一下:
INSERT INTO `test`(`age`, `age1`, `name`, `name1`) VALUES (12345, 12345, 'ganhuojun', 'ganhuojun');
運行結果如下:
1406 - Data too long for column 'name' at row 1, Time: 0.001000s
可見數據長度過大,varchar(5)隻能允許5個字符長度,修改下 sql 語句:
INSERT INTO `test`(`age`, `age1`, `name`, `name1`) VALUES (12345, 12345, 'ganhu', 'ganhuojun');
運行結果如下,說明降低了 name 字段的長度到5是可以成功存儲的
Affected rows: 1, Time: 0.001000s
驗證了varchar(n)中的n确實是指字符串長度
int(n)在mysql數據庫中,int占四個字節,一個字節 8 位,也就是 4 * 8 = 32,即2^32個數字。
那int(n)當中的n會不會和varchar(n)含義一樣,下面将age字段輸入123456來執行一下:
INSERT INTO `test`(`age`, `age1`, `name`, `name1`) VALUES (123456, 123456, 'ganhu', 'ganhuojun');
執行結果如下,發現竟然成功了,說明與varchar(n)含義不一樣,并非限制數據長度。
Affected rows: 1, Time: 0.001000s
那麼這個int(n)中的n到底是什麼含義呢?
int(n) 中的n其實是指最大顯示寬度,最大有效顯示寬度是 255,且顯示寬度與存儲大小或類型包含的值的範圍無關。
下面我們來驗證一下,為了直觀顯示,使用ZEROFILL關鍵字,ZEROFILL的作用是插入數據時,當該字段的值的長度小于定義的長度時,會在該值的前面補上相應的0,重新定義一張表:
CREATE TABLE `test1` (
`id` bigint NOT NULL AUTO_INCREMENT,
`age` int(5) ZEROFILL DEFAULT NULL,
`age1` int ZEROFILL DEFAULT NULL,
`name` varchar(5) DEFAULT NULL,
`name1` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此時,我們插入2組數據對比下結果:
INSERT INTO `test1`(`age`, `age1`, `name`, `name1`) VALUES (1, 123456, 'ganhu', 'ganhuojun');
INSERT INTO `test1`(`age`, `age1`, `name`, `name1`) VALUES (123456, 123456, 'ganhu', 'ganhuojun');
執行後結果如下圖,看到1由于隻有1個寬度,前面補充來4個0,達到了5位,而123456已經是6位了,顯示正常。
此處驗證了插入數據寬度小于定義n時,前面會用0補全,當超過定義的寬度n時,也能正常顯示;注意int(n)并不會限制實際int的存儲大小,依舊可以存4個字節的數據。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!