這個問題是很久以前就發現的問題一直沒有整理,今天有個朋友又問到這個問題。
先看乙個mysql表結構
sql**
create
table `test` (
`typeid` int (2)
) engine=myisam charset=latin1;
sql**
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表為例
c#**
insert into test value(214748347
);
c#**
insert into test value(214748347
);
發現能插入,整個過程如下:
int(2)能插入214748347。
那int(x)的x到底是什麼,x為期望顯示資料的列寬。
期望列寬幹什麼用,這個是和mysql的另外的關鍵字zerofill一起使用
zerofill 含義代表為未到達寬度x的前填充0【或稱為0補位】,超出x代表寬度的數值按原樣顯示。
備註:zerofill自動將int標示為無符號的型別
無該關鍵代表不填充,按原值顯示。
示例如下
過程如下
sql**
create
table `tzfill` (
`typeid` int (4) zerofill
) engine=myisam charset=latin1;
insert
into tzfill value( 12 );
insert
into tzfill value( 558585 );
select * from tzfill;
sql**
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):對於數字型別該校驗的還是要校驗,否則容易出現這樣的問題.
msyql int x 中x的誤解
這個問題是很久以前就發現的問題一直沒有整理,今天有個朋友又問到這個問題。先看乙個mysql表結構 create table test typeid int 2 engine myisam charset latin1 對於test表字段中的typeid 後面的 int 2 中的2代表的到底是什麼含義...
0x8007007E 錯誤解決
message system.io.filenotfoundexception the specified module could not be found.exception from hresult 0x8007007e 這個錯誤表示程式用到了某個dll檔案,但本地windows系統並沒有註冊...
Mysql中的count 的誤解
有時候總認為count 會比count 1 或者count column name 慢,其實這裡面還是有個小坑的。讓我們用乙個例子來了解一下它們的區別 初始化語句 create table test2 id bigint primary key,name varchar 24 engine inno...