200912201933SQL:char 與 varchar 欄位型態考量
在資料庫儲存的型態選擇中,最常用的就是 char 與 int 了。int (Integer)是用來儲存整數型態,而 char 就是用來存放字元、字串的重要型態了。int 型態可依要存放數字的範圍來決定該用哪種整數型態(bigint、int、smallint與tinyint),但 char 與 varchar 該怎麼決定呢?
整數型態 Integer
- bigint:-2^63 ~ 2^63 -1 (9,223,372,036,854,775,807)
- int:-2^31 ~ 2^31 -1 (2,147,483,647)
- smallint:-2^15 ~ 2^15 -1 (32,767)
- tinyint:0 ~ 255
從上面表示的數值範圍可以知道 bigint (佔 8Bytes)、int (佔 4Bytes)、smallint (佔 2Bytes)與tinyint (佔 1Byte),所以當你要存放的數字是類似成績(0-100分),那你只需要宣告該欄位為 Tinyint 即可,不需要一味的宣告 int 浪費空間。
char 與 varchar 的空間大小是以後面參數來表示欄位的大小,不同的地方在於 varchar 是以動態的方式儲存。例如
char(10) 與 varchar(10) 再存放 hello 字串時,char 是佔用10 Bytes的空間,而 varchar 只佔用 5Bytes。
註:char 會佔用 10Bytes 是因為他會自動用空白填滿整個儲存空間,所以真正存在該格的內容是(hello_____),包含了5個空格。
看到這大家肯定會認為宣告為 varchar 是較佳的方式,而實際上還需要考慮存取效率的問題。
假設一個欄位 username 宣告 char(10) 與 varchar(10),char 的情況是DB每次都固定抓取 10 Bytes的大小,不需要判斷欄位內容的長度。反之 varchar 就必須每個欄位值都得用類似pointer 或 linking-list的方式抓取真正的存放內容,如此一來便會耗用系統CPU的運算時間。簡單歸類
char 固定大小浪費空間,所需計算時間少。
varchar 不固定長度,必須要花費較多的CPU計算時間。
以目前硬碟每GB單位成本來看,你覺得對 Server 來說哪樣上算?當然是避免浪費CPU時間囉。
select username from employee
會得到 hello_____ 單純字串比對 hello 你會發現比對錯誤,這是因為後方多了5個空白,該怎麼辦呢?
如同左圖lala 右邊多了些空白一般。
該怎麼解決呢?就用 TRIM 來幫助你除去多餘的空白吧!http://technet.microsoft.com/zh-tw/library/ms139947.aspx
註:在 VS.Net 的指令有 trim、rtrim與 ltrim,若你發現以 trim 在SQL執行會有錯誤,那就用 ltrim或 rtrim就OK囉!
~End