開始之前給大家出個問題,資料庫表test中兩個欄位 a int(2),b int(3),現在想執行下麵的插入語句 思考是否可以插入? 答案是能插入 再看下麵的語句 思考能不能插入?註意第一個數字多了一位變成了11位 資料庫會報如下錯誤 “Out of range value for column ' ...
開始之前給大家出個問題,資料庫表test中兩個欄位 a int(2),b int(3),現在想執行下麵的插入語句
insert into test VALUES(1111111111,1111111111)
思考是否可以插入? 答案是能插入
再看下麵的語句
insert into test VALUES(1111111111,1111111111)
思考能不能插入?註意第一個數字多了一位變成了11位
資料庫會報如下錯誤 “Out of range value for column 'id' at row 1” 數據長度超長
這是為什麼呢?讓我們一起來進入正題。
首先看一下mysql每個整數類型的存儲範圍(圖片來源於網路)
INT[(M)] [UNSIGNED] [ZEROFILL] (int類型數據結構定義)
int類型, 占用位元組數為4byte, 學過電腦原理的同學應該知道, 位元組(byte)並非是電腦存儲的最小單位, 還有比位元組(byte)更小的單位, 也就是位(bit),一個位就代表一個0或1; 8個位組成一個位元組; 一般位元組用大寫B來表示byte, 位用小寫b來表示bit. 電腦存儲單位的換算: 1B=8b 1KB=1024B 1MB=1024KB
那麼根據int類型允許存儲的位元組數是4個位元組, 我們就能換算出int UNSIGNED(無符號)類型的能存儲的最小值為0, 最大值為4294967295(即4B=32b, 最大值即為32個1組成); 所以mysql中的數據類型定位int時,長度固定了(占用4個位元組,32位二進位,無符號時最大值為2的32次方4294967295 二進位位10位); 思考:我們平時定義的int類型都寫成int(11)的原因是什麼? 回到最初的問題 :雖然定義的顯示長度為2和3個十進位位,但是當前數據結構能存儲的是10個十進位位,占用32個二進位位。所以第一組數據能存儲進去,第二組數據無法存儲進去。 總結:mysql中int類型的數據定義的長度(M)為顯示長度,不影響實際存儲的數值的大小,int類型的數據存儲範圍根據有無符號會有不同,最長不超過11位十進位; tips: 當設置了zerofill的時候:添加zerofill的時候系統會給自動添加上unsigned屬性。就是非負數(UNSIGNED)。 不足M位的部分會用0填充,比如 int(4),而插入的值為23,那麼顯示的值為0023; 如果插入的是負數比如-123,將不允許插入(自己測試不允許插入,有網上資源說查詢會顯示0000,無法復現)