最近和人聊起來數據庫存儲字段的類型區別時候發現有些字段自己也不是很清楚,回來查閱了一些資料后才對這些字段的類型有了明確的定義。
數據庫字段的常見類型一般包括:
int bit char varchar nchar nvarchar decimal numeric float datetime smalldatetime當然還有一些不常用到的字段類型
int 是最常見的存儲的存儲類型,它存儲的是從-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型數據
bit:1或0的整數數據。一般存儲bool類型的數據
char和varchar的長度都定義在1到8000之間,它們的區別在於char是定長字符數據,而varchar是變長字符數據。定長字符數據就是不管實際占用的空間是多少總是為這個字段分配這個長度的空間,不足部分默認補充英文空格,而變長字符數據則不會填充。
nchar和nvarchar則表示它表示存儲的是Unicode數據類型的字符。也就是說他們的長度是在1到4000之間, 所謂的Unicode數據類型就是為了解決中文字符和英文字符集這種不兼容的問題而產生的。它所對應的英文字符改為和中文字符一樣用兩個字節來對應,這樣做的結果就是避免了中英文存儲過程中容易造成的混淆,但卻是以犧牲了空間為帶價的。至於他們兩個的區別參照上面的解釋
(4)decimal和numeric
decimal和numeric 這兩種數據類型是等效的。都有兩個參數:p(精度)和s(小數位數)。p指定小數點左邊和右邊可以存儲的十進制數字的最大個數,p必須是從 1到38之間的值。s指定小數點右邊可以存儲的十進制數字的最大個數,s必須是從0到p之間的值,默認小數位數是0。
float:從-1.79^308到1.79^308之間的浮點數字數據
datetime:從1753年1月1日到9999年12月31日的日期和時間數據,精確到百分之三秒。
smalldatetime:從1900年1月1日到2079年6月6日的日期和時間數據,精確到分鍾。
---------------------------------------------------------華麗的分割線---------------------------------------------------------------------
去面試問到這個問題,本來覺得自己理解的很透徹了,結果面試官一句話把我問蔫了, 問為什么這么存儲,現在想起來自己一直是知其然而不知其所以然,現在回過頭想想,使用不同類型的數據類型是綜合了時間和空間的考慮,char(10)類型存儲定長的數據,所以索引效率極高,無論是否達到10個字符,都會去占去10個字節的空間,不足的空間 存儲空值 ,而varchar 所占的空間 是實際長度+1 這里的+1是用來存儲實際用了多少的長度,如果頻繁的修改會不斷的分配新的存儲空間,這會 使用Varchar容易產生碎片化的問題
nchar和nvarchar是因為中英文字符的編碼方式不同,所占的字節數也不同,Unicode字符集就是為了解決這種字符集產生的不兼容的問題產生的,它的所有的字符都用兩個字節表示