1. 程式人生 > >SQL server 2008 定義資料型別

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。可以運用一些與這種資料型別一起使用的特殊函式。