SQL server 2008 定義資料型別
1. 字元資料型別
字元資料型別包括varchar、char、nvarchar、nchar、text以及ntext。這些資料型別用於儲存字元資料。varchar和char型別的主要區別是資料填充。如果有一表列名為FirstName且資料型別為varchar(20),同時將值Brian儲存到該列中,則物理上只儲存5個位元組。但如果在資料型別為char(20)的列中儲存相同的值,將使用全部20個位元組。SQL將插入拖尾空格來填滿20個字元。
如果要節省空間,那麼為什麼還使用char資料型別呢?使用varchar資料型別會稍增加一些系統開銷。例如,如果要儲存兩字母形式的州名縮寫,則最好使用char(2)列。儘管有些DBA認為應最大可能地節省空間,但一般來說,好的做法是在組織中找到一個合適的閾值,並指定低於該值的採用char資料型別,反之則採用varchar資料型別。通常的原則是,任何小於或等於5個位元組的列應儲存為char資料型別,而不是varchar資料型別。如果超過這個長度,使用varchar資料型別的好處將超過其額外開銷。
nvarchar資料型別和nchar資料型別的工作方式與對等的varchar資料型別和char資料型別相同,但這兩種資料型別可以處理國際性的Unicode字元。它們需要一些額外開銷。以Unicode形式儲存的資料為一個字元佔兩個位元組。如果要將值Brian儲存到nvarchar列,它將使用10個位元組;而如果將它儲存為nchar(20),則需要使用40位元組。由於這些額外開銷和增加的空間,應該避免使用Unicode列,除非確實有需要使用它們的業務或語言需求。
接下來要提的資料型別是text和ntext。text資料型別用於在資料頁內外儲存大型字元資料。應儘可能少地使用這兩種資料型別,因為可能影響效能但可在單行的列中儲存多達2GB的資料。與text資料型別相比,更好的選擇是使用varchar(max)型別,因為將獲得更好的效能。另外,text和ntext資料型別在SQL Server的一些未來版本中將不可用,因此現在開始還是最好使用varchar(max)和nvarchar(max)而不是text和ntext資料型別。
表1-1列出了這些型別,對其作了簡單描述,並說明了要求的儲存空間。
表1-1
數 據 類 型 |
描 述 |
存 儲 空 間 |
Char(n) |
N為1~8000字元之間 |
n位元組 |
Nchar(n) |
N為1~4000 Unicode字元之間 |
(2n位元組)+2字 節額外開銷 |
Ntext |
最多為230–1 (1 073 741 823)Unicode字元 |
每字元2位元組 |
Nvarchar(max) |
最多為230–1 (1 073 741 823)Unicode字元 |
2×字元數+2字 節額外開銷 |
Text |
最多為231–1 (2 147 483 647)字元 |
每字元1位元組 |
Varchar(n) |
N為1~8000字元之間 |
每字元1位元組+2 位元組額外開銷 |
Varchar(max) |
最多為231–1(2 147 483 647)字元 |
每字元1位元組+2 位元組額外開銷 |
2. 精確數值資料型別
數值資料型別包括bit、tinyint、smallint、int、bigint、numeric、decimal、money、float以及real。這些資料型別都用於儲存不同型別的數字值。第一種資料型別bit只儲存0或1,在大多數應用程式中被轉換為true或false。bit資料型別非常適合用於開關標記,且它只佔據一個位元組空間。其他常見的數值資料型別如表1-2所示。
表1-2
數 據 類 型 |
描 述 |
存 儲 空 間 |
bit |
0、1或Null |
1位元組(8位) |
tinyint |
0~255之間的整數 |
1位元組 |
smallint |
–32 768~32 767之間的整數 |
2位元組 |
int |
–2 147 483 648~ 2 147 483 647之間的整數 |
4位元組 |
bigint |
–9 223 372 036 854 775 808~ 9 223 372 036 854 775 807 之間的整數 |
8位元組 |
(續表)
數 據 類 型 |
描 述 |
存 儲 空 間 |
numeric(p,s)或 decimal(p,s) |
–1 038+1~1 038–1之間的數值 |
最多17位元組 |
money |
–922 337 203 685 477.580 8~ 922 337 203 685 477.580 7 |
8位元組 |
smallmoney |
–214 748.3648~2 14 748.3647 |
4位元組 |
SQL Server 2008資料型別(2)
如decimal和numeric等數值資料型別可儲存小數點右邊或左邊的變長位數。Scale是小數點右邊的位數。精度(Precision)定義了總位數,包括小數點右邊的位數。例如,由於14.88531可為numeric(7,5)或decimal(7,5)。如果將14.25插入到numeric(5,1)列中,它將被舍入為14.3。
3. 近似數值資料型別
這個分類中包括資料型別float和real。它們用於表示浮點資料。但是,由於它們是近似的,因此不能精確地表示所有值。
float(n)中的n是用於儲存該數尾數(mantissa)的位數。SQL Server對此只使用兩個值。如果指定位於1~24之間,SQL就使用24。如果指定25~53之間,SQL就使用53。當指定float()時(括號中為空),預設為53。
表1-3列出了近似數值資料型別,對其進行簡單描述,並說明了要求的儲存空間。
表1-3
數 據 類 型 |
描 述 |
存 儲 空 間 |
float[(n)] |
–1.79E+308~–2.23E– 308,0,2.23E–308~1.79E+308 |
N< =24-4位元組 N> 24-8位元組 |
real() |
–3.40E+38~–1.18E– 38,0,1.18E–38~3.40E+38 |
4位元組 |
注意:
real的同義詞為float(24)。
4. 二進位制資料型別
如varbinary、binary、varbinary(max)或image等二進位制資料型別用於儲存二進位制資料,如圖形檔案、Word文件或MP3檔案。其值為十六進位制的0x0~0xf。image資料型別可在資料頁外部儲存最多2GB的檔案。image資料型別的首選替代資料型別是varbinary(max),可儲存最多8KB的二進位制資料,其效能通常比image資料型別好。SQL Server 2008的新功能是可以在作業系統檔案中通過FileStream儲存選項儲存varbinary(max)物件。這個選項將資料儲存為檔案,同時不受varbinary(max)的2GB大小的限制。
表1-4列出了二進位制資料型別,對其作了簡單描述,並說明了要求的儲存空間。
表1-4
數 據 類 型 |
描 述 |
存 儲 空 間 |
Binary(n) |
N為1~8000十六進位制數字之間 |
n位元組 |
Image |
最多為231–1 (2 147 483 647)十六進位制數位 |
每字元1位元組 |
Varbinary(n) |
N為1~8000十六進位制數字之間 |
每字元1位元組 +2位元組額外開銷 |
Varbinary(max) |
最多為231–1 (2 147 483 647)十六進位制數字 |
每字元1位元組 +2位元組額外開銷 |
5. 日期和時間資料型別
datetime和smalldatetime資料型別用於儲存日期和時間資料。smalldatetime為4位元組,儲存1900年1月1日~2079年6月6日之間的時間,且只精確到最近的分鐘。datetime資料型別為8位元組,儲存1753年1月1日~9999年12月31日之間的時間,且精確到最近的3.33毫秒。
SQL Server 2008有4種與日期相關的新資料型別:datetime2、dateoffset、date和time。通過SQL Server聯機叢書可找到使用這些資料型別的示例。
datetime2資料型別是datetime資料型別的擴充套件,有著更廣的日期範圍。時間總是用時、分鐘、秒形式來儲存。可以定義末尾帶有可變引數的datetime2資料型別--如datetime2(3)。這個表示式中的3表示儲存時秒的小數精度為3位,或0.999。有效值為0~9之間,預設值為3。
datetimeoffset資料型別和datetime2資料型別一樣,帶有時區偏移量。該時區偏移量最大為+/-14小時,包含了UTC偏移量,因此可以合理化不同時區捕捉的時間。
date資料型別只儲存日期,這是一直需要的一個功能。而time資料型別只儲存時間。它也支援time(n)宣告,因此可以控制小數秒的粒度。與datetime2和datetimeoffset一樣,n可為0~7之間。
表1-5列出了日期/時間資料型別,對其進行簡單描述,並說明了要求的儲存空間。
表1-5
數 據 類 型 |
描 述 |
存 儲 空 間 |
Date |
9999年1月1日~12月31日 |
3位元組 |
Datetime |
1753年1月1日~9999年12月31日, 精確到最近的3.33毫秒 |
8位元組 |
Datetime2(n) |
9999年1月1日~12月31日 0~7之間的N指定小數秒 |
6~8位元組 |
Datetimeoffset(n) |
9999年1月1日~12月31日 0~7之間的N指定小數秒+/–偏移量 |
8~10位元組 |
SmalldateTime |
1900年1月1日~2079年 6月6日,精確到1分鐘 |
4位元組 |
Time(n) |
小時:分鐘:秒.9999999 0~7之間的N指定小數秒 |
3~5位元組 |
6. 其他系統資料型別
還有一些之前未見過的資料型別。表1-6列出了這些資料型別。
表1-6
數 據 類 型 |
描 述 |
存 儲 空 間 |
Cursor |
包含一個對游標的引用和 可以只用作變數或儲存過程引數 |
不適用 |
Hierarchyid |
包含一個對層次結構中位置的引用 |
1~892位元組+2 位元組的額外開銷 |
SQL_Variant |
可能包含任何系統資料類 型的值,除了text、ntext、 image、timestamp、xml、 varchar(max)、nvarchar(max)、 varbinary (max)、sql_variant以 及使用者定義的資料型別。最大尺 寸為8000位元組資料+16位元組 (或元資料) |
8016位元組 |
Table |
用於儲存用於進一步處理的數 據集。定義類似於Create Table。 主要用於返回表值函式的結果集, 它們也可用於儲存過程和批處理中 |
取決於表定 義和儲存的行數 |
Timestamp or Rowversion |
對於每個表來說是唯一的、自 動儲存的值。通常用於版本戳, 該值在插入和每次更新時自動改變 |
8位元組 |
Uniqueidentifier |
可以包含全域性唯一識別符號 (Globally Unique Identifier, GUID)。guid值可以從Newid() 函式獲得。這個函式返回的值對 所有計算機來說是唯一的。 儘管儲存為16位的二進位制值, 但它顯示為char(36) |
16位元組 |
XML |
可以以Unicode或非Unicode形式儲存 |
最多2GB |
注意:
cursor資料型別可能不用於Create Table語句中。
hierarchyid列是SQL Server 2008中新出現的。您可能希望將這種資料型別的列新增到這樣的表中--其錶行中的資料可用層次結構表示,就像組織層次結構或經理/僱員層次結構一樣。儲存在該列中的值是行在層次結構中的路徑。層次結構中的級別顯示為斜槓。斜槓間的值是這個成員在行中的數字級別,如/1/3。可以運用一些與這種資料型別一起使用的特殊函式。