SQL SERVER 數據類型詳解(SQL Server 2008)


 

數據類型類別

 

SQL Server 中的數據類型歸納為下列類別:

在 SQL Server 中,根據其存儲特征,某些數據類型被指定為屬於下列各組:

  • 大值數據類型:varchar(max)、nvarchar(max) 和 varbinary(max)

  • 大型對象數據類型:text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max) 和 xml

1.精確數字

如decimal和numeric等數值數據類型可存儲小數點右邊或左邊的變長位數。Scale是小數點右邊的位數。精度(Precision)定義了總位數,包括小數點右邊的位數。例如,由於14.88531可為numeric(7,5)或decimal(7,5)。如果將14.25插入到numeric(5,1)列中,它將被舍入為14.3。

數 據 類 型

描 述

存 儲 空 間

注釋

bit

0、1或Null的整數數據類型

1字節(8位)

SQL Server 數據庫引擎可優化 bit 列的存儲。如果表中的列為 8 bit 或更少,則這些列作為 1 個字節存儲。如果列為 9 到 16 bit,則這些列作為 2 個字節存儲,以此類推。

字符串值 TRUE 和 FALSE 可以轉換為以下 bit 值:TRUE 轉換為 1,FALSE 轉換為 0。

bigint -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 8 字節

int 數據類型是 SQL Server 中的主要整數數據類型。bigint 數據類型用於整數值可能超過 int 數據類型支持范圍的情況。

在數據類型優先次序表中,bigint 介於 smallmoney 和 int 之間。

只有當參數表達式為 bigint 數據類型時,函數才返回 bigint。SQL Server 不會自動將其他整數數據類型(tinyint、smallint 和 int)提升為 bigint。

int -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647) 4字節
smallint -2^15 (-32,768) 到 2^15-1 (32,767) 2字節
tinyint 0 到 255 1字節
decimal[ (p[ ,s] )] 固定精度和小數位數。使用最大精度時,有效值從 - 10^38 +1 到 10^38 - 1。decimal 的 ISO 同義詞為 dec 和 dec(p, s)。numeric 在功能上等價於 decimal。p(精度)

最多可以存儲的十進制數字的總位數,包括小數點左邊和右邊的位數。該精度必須是從 1 到最大精度 38 之間的值。默認精度為 18。

s(小數位數)

小數點右邊可以存儲的十進制數字的最大位數。小數位數必須是從 0 到 p 之間的值。僅在指定精度后才可以指定小數位數。默認的小數位數為 0;因此,0 <= s <= p。最大存儲大小基於精度而變化。

精度 存儲字節數

1 - 9

5

10-19

9

20-28

13

29-38

17

 
numeric[ (p[ ,s] )]  
money -922,337,203,685,477.5808 到 922,337,203,685,477.5807 8字節 money 和 smallmoney 數據類型精確到它們所代表的貨幣單位的萬分之一。
smallmoney -214,748.3648 到 214,748.3647 4字節

2.近似數字

用於表示浮點數值數據的大致數值數據類型。浮點數據為近似值;因此,並非數據類型范圍內的所有值都能精確地表示。

這個分類中包括數據類型float和real。它們用於表示浮點數據。但是,由於它們是近似的,因此不能精確地表示所有值。

float(n)中的n是用於存儲該數尾數(mantissa)的位數。SQL Server對此只使用兩個值。如果指定位於1~24之間,SQL就使用24。如果指定25~53之間,SQL就使用53。當指定float()時(括號中為空),默認為53。

數 據 類 型

描 述

存 儲 空 間

注釋

float [ (n) ]

其中 n 為用於存儲 float 數值尾數的位數(以科學記數法表示),因此可以確定精度和存儲大小。如果指定了 n,則它必須是介於 153 之間的某個值。n 的默認值為 53

 

-1.79E + 308 至 -2.23E - 308、0 以及 2.23E - 308 至 1.79E + 308

取決於 n 的值

 

n value

精度

存儲大小

1-24

7 位數

4 字節

25-53

15 位數

8 字節

SQL Server 將 n 視為下列兩個可能值之一。如果 1<=n<=24,則將 n 視為 24。如果 25<=n<=53,則將 n 視為 53
SQL Server float[(n)] 數據類型從 153 之間的所有 n 值均符合 ISO 標准。double precision 的同義詞為 float(53)。
real -3.40E + 38 至 -1.18E - 38、0 以及 1.18E - 38 至 3.40E + 38 4 字節 real 的 ISO 同義詞為 float(24)。

3.日期和時間類型

對於新的工作,請使用 time、date、datetime2 和 datetimeoffset 數據類型。這些類型符合 SQL 標准。它們更易於移植。time、datetime2 和 datetimeoffset 提供更高精度的秒數。datetimeoffset 為全局部署的應用程序提供時區支持。

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之間。

數 據 類 型

描 述

存 儲 空 間

注釋
time 00:00:00.0000000 到 23:59:59.9999999
精確度:100納秒
字符長度:最小 8 位 (hh:mm:ss),最大 16 位 (hh:mm:ss.nnnnnnn)
3~5字節  
date 0001-01-01 到 9999-12-31
字符長度:10 位
固定3個字節
1、3 字節整數存儲日期。
 
smalldatetime 日期范圍:1900-01-01 到 2079-06-06
時間范圍:00:00:00 到 23:59:59
精確度:1分鍾
字符長度:最高 19 位
4字節 2007-5-9 23:59:59 將被舍為 2007-5-10 00:00:00
datetime 日期范圍:1753-1-1 到 9999-12-31
時間范圍:00:00:00 -23:59:59.997
精確度:0.00333 秒
字符長度:最低 19 位到最高 23 位
8字節
 
datetime2 0001-01-01 00:00:00.0000000 到 9999-12-31 23:59:59.9999999
精確度:100納秒
6~8字節  
datetimeoffset 日期范圍:0001-01-01 00:00:00.0000000 到 9999-12-31 23:59:59.9999999(以 UTC
 時間表示)
時間范圍:00:00:00 到 23:59:59.9999999
精確度:100納秒
字符長度:最低 26 位 (YYYY-MM-DD hh:mm:ss {+|-}hh:mm) 到最高 34 位 (YYYY-MM-DD hh:mm:ss.nnnnnnn {+|-}hh:mm)
8~10字節
默認值為 10 個字節的固定大小,默認的秒的小數部分精度為 100ns。
 

4. 字符數據類型

字符數據類型包括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數據類型。

數 據 類 型

描 述

存 儲 空 間

注釋

Char(n)

固定長度,

n取值:1~8000

char的ISO同義詞:character

n字節

如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果在使用 CAST 和 CONVERT 函數時未指定 n,則默認長度為 30。

將為使用 char 或 varchar 的對象指派數據庫的默認排序規則,除非使用 COLLATE 子句指派了特定的排序規則。該排序規則控制用於存儲字符數據的代碼頁。

如果站點支持多語言,請考慮使用 Unicode nchar 或 nvarchar 數據類型,以最大限度地消除字符轉換問題。如果使用 char 或varchar,建議執行以下操作:

  • 如果列數據項的大小一致,則使用 char。

  • 如果列數據項的大小差異相當大,則使用 varchar。

  • 如果列數據項大小相差很大,而且大小可能超過 8,000 字節,請使用 varchar(max)。

當執行 CREATE TABLE 或 ALTER TABLE 時,如果 SET ANSI_PADDING 為 OFF,則定義為 NULL 的 char 列將作為 varchar 處理。

Varchar(n|max)
可變長度,
n取值:1~8000
max最大存儲大小是:2^31-1 個字節 (2 GB)
varchar的ISO同義詞:char varying或character varying

每字符1字節+2

字節額外開銷


text 服務器代碼頁中長度可變的非Unicode數據,
最大長度: 2^31-1 (2,147,483,647) 個字節
當服務器代碼頁使用雙字節字符時,存儲仍是 2,147,483,647 字節。根據字符串,存儲大小可能小於 2,147,483,647 字節。  
nchar(n)
固定長度,Unicode字符串數據,
n取值:1~4000
char的ISO同義詞:national char或national character
2n(每字符2字節)
n(排序規則代碼頁使用雙字節字符時)

如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果沒有使用 CAST 函數指定 n,則默認長度為 30。

如果列數據項的大小可能相同,請使用 nchar。

如果列數據項的大小可能差異很大,請使用 nvarchar。

sysname 是系統提供的用戶定義數據類型,除了不可為空值外,在功能上與 nvarchar(128) 相同。sysname 用於引用數據庫對象名。

為使用 nchar 或 nvarchar 的對象分配的是默認的數據庫排序規則,但可使用 COLLATE 子句分配特定的排序規則。

SET ANSI_PADDING ON 永遠適用於 nchar 和 nvarchar。SET ANSI_PADDING OFF 不適用於 nchar 或 nvarchar 數據類型。

nvarchar(n| max)
可變長度,Unicode字符串數據,
n取值:1~4000
max最大存儲為大小是:2^31-1 個字節 (2 GB)
nvarchar的ISO同義詞:national char varying、national character varying

2n(每字符2字節)+2字節

ntext

 

長度可變的 Unicode 數據,字符串最大長度為 2^30 - 1 (1,073,741,823) 個字節。
ntext 的 ISO 同義詞為 national text

存儲大小是所輸入字符串長度的兩倍(以字節為單位)

 

5.二級制類型

如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大小的限制。

數 據 類 型

描 述

存 儲 空 間

注釋

binary(n)

固定長度,

n取值:1~8000

char的ISO同義詞:character

n字節

如果沒有在數據定義或變量聲明語句中指定 n,則默認長度為 1。如果沒有使用 CAST 函數指定 n,則默認長度為 30。

如果列數據項的大小一致,則使用 binary。

如果列數據項的大小差異相當大,則使用 varbinary。

當列數據條目超出 8,000 字節時,請使用 varbinary(max)。

varbinary(n|max)
可變長度,
n取值:1~8000
max最大存儲大小是:2^31-1 個字節 (2 GB)
varbinary 的 ANSI SQL 同義詞為 binary varying

存儲大小為所輸入數據的實際長度 + 2 個字節。所輸入數據的長度可以是 0 字節


image 長度可變的二進制數據,從 0 到 2^31-1 (2,147,483,647) 個字節。    

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。可以運用一些與這種數據類型一起使用的特殊函數。

XML數據存儲XML文檔或片段。根據文檔中使用UTF-16或是UTF-8,它在尺寸上像text或ntext一樣存儲。XML數據類型使用特殊構造體進行搜索和索引。第15章將更詳細地介紹這些內容。

7. CLR集成

在SQL Server 2008中,還可使用公共語言運行庫(Common Language Runtime,CLR)創建自己的數據類型和存儲過程。這讓用戶可以使用Visual Basic或C#編寫更復雜的數據類型,以滿足業務需求。這些類型被定義為基本的CLR語言中的類結構。                


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM