這個問題是很久以前就發現的問題一直沒有整理,今天有個朋友又問到這個問題。
先看一個mysql表結構
- CREATE TABLE `test` (
- `TYPEID` int (2)
- ) ENGINE=MyISAM CHARSET=latin1;
- CREATE TABLE `test` (
- `TYPEID` int (2)
- ) ENGINE=MyISAM CHARSET=latin1;
CREATE TABLE `test` (
`TYPEID` int(2)
) ENGINE=MyISAM CHARSET=latin1;
對於test表字段中的typeId 後面的 int(2)中的2代表的到底是什麼含義。
對於大多數的人來說我們馬上想到的是varchar(2)後面的2代表爲兩個字節,也就不難把int後的2誤認爲2位即typeId的最大存入的數爲99【俺以前也一直這麼認爲的】 。
這樣的想法一直延續的有個項目,對於數值類型只能在100內的字段忘記作校驗就給插入數據庫,測試的同事了把一個千位數插入,竟然插入並且數據庫中數據也 正確。汗,當時我的第一反應是測試服務器的表創建錯誤,檢查一遍沒有啊。回到本地也測試了下發現也存在這個問題。逼的沒辦法了就上網上找資料,終於找到了 以下說明。
對於mysql的int來說它的長度是不變的及爲4個字節、對於插入數據數據大小也是不變的。
帶符號的數值大小範圍爲:-2147483648 到214748347
無符號的:0到4294967295
int(x)的x並不能改變int類型字段存入數據值的大小【即不能限制數值的範圍】
舉個示例說
int(2)能存入214748347。
int(1)也能存入214748347。
示例使用test表爲例
- insert into test value( <strong>214748347</strong>
- );
- insert into test value( <strong>214748347</strong>
- );
發現能插入,整個過程如下:
int(2)能插入214748347。
那int(x)的x到底是什麼,x爲期望顯示數據的列寬。
期望列寬幹什麼用,這個是和mysql的另外的關鍵字zerofill一起使用
zerofill 含義代表爲未到達寬度x的前填充0【或稱爲0補位】,超出x代表寬度的數值按原樣顯示。
備註:zerofill自動將int標示爲無符號的類型
無該關鍵代表不填充,按原值顯示。
示例如下
過程如下
- CREATE TABLE `tZfill` (
- `TYPEID` int (4) zerofill
- ) ENGINE=MyISAM CHARSET=latin1;
- insert into tZfill value( 12 );
- insert into tZfill value( 558585 );
- select * from tZfill;
- CREATE TABLE `tZfill` (
- `TYPEID` int (4) zerofill
- ) ENGINE=MyISAM CHARSET=latin1;
- insert into tZfill value( 12 );
- insert into tZfill value( 558585 );
- select * from tZfill;
CREATE TABLE `tZfill` (
`TYPEID` int(4) zerofill
) ENGINE=MyISAM CHARSET=latin1;
insert into tZfill value( 12 );
insert into tZfill value( 558585 );
select * from tZfill;
整個執行過程
mysql中的TINYINT、SMALLINT等數據類型都是這樣表示。
(1): 這樣可以看出mysql對於數值類型來說不管是多大的數它的存儲大小沒有改變【該佔幾個字節還是佔幾個字節,不因期望存儲寬度即x而改變】,所以我們開發時候的選擇合適的數值類型能用小的存儲位數的就用小的。
(2):對於數字類型該校驗的還是要校驗,否則容易出現這樣的問題.