首頁 > 軟體

SQL Server中的資料型別詳解

2022-05-21 19:00:11

T-SQL語言和SQLServer資料庫中的資料通常需要定義一個資料型別,資料型別定義了物件可以容納的資料的種類。

哪些物件需要資料型別

(1)、表和檢視的列:
在定義表或檢視時,其列需要定義資料型別。

(2)、儲存過程的引數:
在定義儲存過程的T-SQL程式碼中定義引數的資料型別。

(3)、變數:
如果在T-SQL中使用變數,需要定義資料型別。

(4)、帶返回值的函數:
返回一個或多個特定型別資料值的T-SQL函數中的返回值需要定義資料型別。

(5)、帶返回程式碼的儲存過程:
具有返回程式碼的儲存過程。

一、 整數資料型別

1、bit

bit資料型別是整型,其值只能是0、1或空值。這種資料型別用於儲存只有兩種可能值的資料,如Yes 或No、True 或False 、On 或Off.   
注意:很省空間的一種資料型別,如果能夠滿足需求應該儘量多用。每個TINYINT型別的資料佔用1個位元組的儲存空間。

  • bit值儲存為1、0或NULL 的整數資料型別。1代表true,0代表false。
  • 在插入、修改 bit 資料時,使用 0 或 1。
    SQL Server將字串值“TRUE”(字串不分大小寫,或者數位字元'1')轉換為1,將“FALSE”(字串不分大小寫,或者數位字元'0')轉換為0。將任何非零值轉換為1。
  • 在c# 中讀取資料庫資料時,可以直接用bool型讀取該欄位,會直接轉換為true/false。

2、tinyint

tinyint資料型別儲存從0 到255 之間的所有正整數。每個tinyint型別的資料佔用1個位元組的儲存空間。

3、smallint

smallint 資料型別儲存從-2的15次方( -32768) 到2的15次方-1( 32767 )之間的所有正負整數。
每個smallint型別的資料佔用2個位元組的儲存空間,其中1 位表示整數值的正負號,其它15 位表示整數值的長度和大小。

4、int (integer)

int (或 integer)資料型別儲存從-2的31次方 (-2147483648) 到2的31次方-1 (2147483647) 之間的所有正負整數。
每個INT 型別的資料按4個位元組儲存,其中1 位表示整數值的正負號,其它31 位表示整數值的長度和大小。

5、bigint

bigint資料型別儲存從-2^63 (-9 223372036854775807) 到2^63-1( 9223372036854775807) 之間的所有正負整數。
每個BIGINT 型別的資料佔用8個位元組的儲存空間。

二、 浮點資料型別

浮點資料型別用於儲存十進位制小數。浮點數值的資料在SQL Server 中採用上舍入(Round up 或稱為只入不捨)方式進行儲存。
所謂上舍入是指,當(且僅當)要舍入的數是一個非零數時,對其保留數位部分的最低有效位上的數值加1 ,並進行必要的進位。若一個數是上舍入數,其絕對值不會減少。
如:對3.14159265358979 分別進行2 位和12位元舍入,結果為3.15 和3.141592653590。

1、real: 近似數值型

real資料型別可精確到第7 位小數,其範圍為從-3.40E -38 到3.40E +38。 每個real型別的資料佔用4 個位元組的儲存空間。

2、float[(n)]:近似數值型

float資料型別可精確到第15 位小數,其範圍為從-1.79E -308 到1.79E +308。 每個FLOAT 型別的資料佔用8 個位元組的儲存空間。 
float資料型別可寫為FLOAT[ n ]的形式。n 指定float資料的精度。n 為1到15 之間的整數值。當n 取1 到7 時,實際上是定義了一個real型別的資料,系統用4 個位元組儲存它;
當n 取8 到15 時,系統認為其是float型別,用8 個位元組儲存它。

3、decimal[p [s] ]

decimal資料型別可以提供小數所需要的實際儲存空間,但也有一定的限制,您可以用2 到17 個位元組來儲存從-10的38次方-1 到10的38次方-1 之間的數值。
可將其寫為decimal[ p [s] ]的形式,p 和s 確定了精確的比例和數位。其中p 表示可供儲存的值的總位數(不包括小數點),預設值為18; s 表示小數點後的位數,預設值為0。
例如:decimal (15 5),表示共有15 位數,其中整數10 位,小數5。  

4、numeric[p [s] ]

numeric資料型別與decimal 資料型別完全相同。
注意:SQL Server 為了和前端的開發工具配合,其所支援的資料精度預設最大為28位元。但可以通過使用命令來執行sqlserver.exe程式以啟動SQL Server,可改變預設精度。

5、smallMoney貨幣型

smallMoney 資料型別用來表示錢和貨幣值。這種資料型別能儲存從-214748.3648 到214748.3647 之間的資料,精確到貨幣單位的萬分之一。smallmoney 資料型別要求 4 個儲存位元組。

6、money貨幣型

money資料型別用來表示錢和貨幣值。這種資料型別能儲存從-9220億到9220 億之間的資料,精確到貨幣單位的萬分之一。money資料型別要求 8 個儲存位元組。

三、字元資料型別

字元資料型別是使用最多的資料型別。它可以用來儲存各種字母、數位符號、特殊符號。一般情況下,使用字元型別資料時須在其前後加上單引號’或雙引號” 。

1、char[(n)]

char資料型別的定義形式為char[(n)] 。 以char型別儲存的每個字元和符號佔一個位元組的儲存空間。n 表示所有字元所佔的儲存空間,n 的取值為1 到8000, 
即可容納8000 個ANSI 字元。若不指定n 值,則系統預設值為1。若輸入資料的字元數小於n,則系統自動在其後新增空格來填滿設定好的空間。若輸入的資料過長,將會截掉其超出部分。

如果沒有在資料定義或變數宣告語句中指定 n,則預設長度為 1如果在使用 CAST 和 CONVERT 函數時未指定 n,則預設長度為 30。

2、nchar[(n)]

nchar資料型別的定義形式為nchar[(n)]。 它與char型別相似。不同的是nchar資料型別n的取值為1 到4000。 因為nchar型別採用UNICODE 標準字元集(CharacterSet)。 
UNICODE 標準規定每個字元佔用兩個位元組的儲存空間,所以它比非UNICODE 標準的資料型別多佔用一倍的儲存空間。使用UNICODE 標準的好處是因其使用兩個位元組做儲存單位,
其一個儲存單位的容納量就大大增加了,可以將全世界的語言文字都囊括在內,在一個資料列中就可以同時出現中文、英文、法文、德文等,而不會出現編碼衝突。

3、varchar[(n| max )]

varchar資料型別的定義形式為varchar[(n| max )]。 它與char型別相似,n 的取值也為1 到8000,若輸入的資料過長,將會截掉其超出部分。
不同的是,varchar資料型別具有變動長度的特性,因為varchar資料型別的儲存長度為實際數值長度,若輸入資料的字元數小於n ,則系統不會在其後新增空格來填滿設定好的空間。
一般情況下,由於char資料型別長度固定,因此它比varchar型別的處理速度快。

4、nvarchar[(n| max )]

nvarchar資料型別的定義形式為nvarchar [ ( n | max ) ]它與varchar型別相似。不同的是,nvarchar資料型別採用UNICODE 標準字元集(Character Set), n 的取值為1 到4000。

5、text

text資料型別用於儲存大量文字資料,其容量理論上為1 到2的31次方-1 (2147483647)個位元組,在實際應用時需要視硬碟的儲存空間而定。
SQL Server 中,將text和image 型別的資料直接存放到表的資料行中。

6 、ntext

ntext資料型別與text型別相似不同的,是ntext型別採用UNICODE 標準字元集(Character Set), 因此其理論容量為230-1(1073741823)個位元組。

四、 日期和時間資料型別

日期和時間資料型別及函數 - SQL Server (Transact-SQL) | Microsoft 官方檔案

1、datetime :日期和時間(1753-1-1 日到 9999-12-31)

datetime 資料型別用於儲存日期和時間的結合體。它可以儲存從公元1753 年1 月1 日零時起到公元9999 年12 月31 日23 時59 分59 秒之間。精確到三百分之一秒或3.33毫秒 

2、dateTime2 (n):高精度的datetime型別(0001-01-01 到 9999-12-31)

類似於之前的datetime型別,不過其精度比較高,可以精確到小數點後面7位(100ns),其使用語法為:datetime2(n)。
0001-01-01 00:00:00.0000000到9999-12-31 23:59:59:9999999,表示日期和時間

使用範例:

declare @dt as datetime2(5)
set @dt = getdate()
select @dt

3、smalldatetime  :精確到分鐘,日期和時間。(1900-01-01 到 2079-06-06)不推薦。

smalldatetime 資料型別用來表示小範圍間的日期和時間,精確到一分鐘。

4、date:只表示日期:年-月-日(0001-01-01 到 9999-12-31)

按照年-月-日的格式表示日期

5、time:只表示時間:hh:mm:ss(00:00:00.0000000 到 23:59:59.9999999)

按照hh:mm:ss的格式精確表示時間

6、datetimeOffset:時間部分增加時區表示

加入了時區偏移量部分,時區偏移量表示為 [+|-] HH:MM。  必需的 + 或 - 符號指示在 UTC(通用協調時間或格林尼治標準時間)中是加上還是減去時區偏移量以獲取本地時間。

00000-01-01 00:00:00.0000000到99999-12-31 23:59:59:9999999

使用範例:

declare @dt as datetimeoffset(8)
set @dt = '2008-08-08 08:08:08.0 +8:00'
select @dt

五、二進位制資料型別

1、binary

binary 資料型別用於儲存二進位制資料。其定義形式為binary (n), n 表示資料的長度,取值為1 到8000 。
在使用時必須指定binary 型別資料的大小,至少應為1 個位元組。BINARY 型別資料佔用n+4 個位元組的儲存空間。
在輸入資料時必須在資料前加上字元“0X” 作為二進位制標識,如:要輸入“abc ”則應輸入“0xabc ”。
若輸入的資料過長將會截掉其超出部分。若輸入的資料位數為奇數,則會在起始符號“0X ”後新增一個0,如上述的“0xabc ”會被系統自動變為“0x0abc”。

2、varbinary

varbinary 資料型別的定義形式為varbinary (n)。 它與binary 型別相似,n 的取值也為1 到8000,若輸入的資料過長,將會截掉其超出部分。
不同的是varbinary 資料型別具有變動長度的特性,因為varbinary 資料型別的儲存長度為實際數值長度+4個位元組。當binary 資料型別允許NULL 值時,將被視為varbinary 資料型別。
一般情況下,由於BINARY 資料型別長度固定,因此它比varbinary  型別的處理速度快。

3、image

image 資料型別用於儲存大量的二進位制資料Binary Data。其理論容量為2的31次方-1(2147483647)個位元組。其儲存資料的模式與text資料型別相同。
通常用來儲存圖形等OLE Object Linking and Embedding物件連線和嵌入物件。在輸入資料時同BINARY資料型別一樣,必須在資料前加上字元“0X”作為二進位制標識。應用程式可以使用BMP、TIEF、GIF 和 JPEG 格式把資料儲存在 image 資料型別中。

六、特殊資料型別

1、 cursor:遊標參照

cursor 資料型別是一種特殊的資料型別,它包含一個對遊標的參照。這種資料型別用在儲存過程中,而且建立表時不能用。

T-SQL遊標

2、timestamp:時間戳

timestamp 資料型別是一種特殊的資料型別,用來建立一個資料庫範圍內的唯一數碼。 一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。Timestamp 用於表示SQL Server 活動的先後順序。儘管它的名字中有“time”, 但timestamp列不是人們可識別的日期。在一個資料庫裡,timestamp值是唯一的  。timestamp的資料型別為rowVersion資料型別的同義詞。

3、uniqueIdentifier:全域性唯一識別符號,即GUID

uniqueIdentifier資料型別用來儲存一個全域性唯一識別符號,即GUID。由 16 位元組的十六進位制數位組成。GUID確實是全域性唯一的。這個數幾乎沒有機會在另一個系統中被重建。可以使用NEWID 函數或轉換一個字串為唯一識別符號來初始化具有唯一識別符號的列。

例如:6F9619FF-8B86-D011-B42D-00C04FC964FF,此號碼可以通過newid()函數獲得,在全世界各地的計算機由此函數產生的數位不會相同。

4、sql_variant:SQL變數

用於儲存除文字,圖形資料和timestamp資料外的其它任何合法的Sql Server資料,可以方便Sql Server的開發工作。

5、table:表

用於儲存對錶或檢視處理後的結果集。這種新的資料型別使得變數可以儲存一個表,從而使函數或過程返回查詢結果更加方便、快捷。

6、xml

儲存xml資料的資料型別。可以在列中或者xml型別的變數中儲存xml範例。儲存的xml資料型別表示範例大小不能超過2GB。

SQL Server XML型別

七、SQL Server 2008新增資料型別

hierarchid

新增的資料型別,用於建立層次結構的表,或參照位於另一位置的資料層次結構。

八、使用者定義的資料型別

使用者定義的資料型別基於在 Microsoft SQL Server 中提供的資料型別。當幾個表中必須儲存同一種資料型別時,並且為保證這些列有相同的資料型別、長度和可空性時,可以使用使用者定義的資料型別。例如,可定義一種稱為postal_code 的資料型別,它基於 Char 資料型別。
當建立使用者定義的資料型別時,必須提供三個數:資料型別的名稱、所基於的系統資料型別和資料型別的可空性。

圖形化操作:【可程式化性】-->【型別】節點,右擊【使用者定義資料型別】節點,在彈出的框中,按照說明相應操作即可。

(1)建立使用者定義的資料型別

建立使用者定義的資料型別可以使用 Transact-SQL 語句。系統儲存過程 sp_addtype 可以來建立使用者定義的資料型別。其語法形式如下:

sp_addtype {type},[,system_data_bype][,'null_type']

其中,type 是使用者定義的資料型別的名稱。system_data_type 是系統提供的資料型別,例如 Decimal、Int、Char   等等。 null_type 表示該資料型別是如何處理空值的,必須使用單引號引起來,例如'NULL'、'NOT NULL'或者'NONULL'。
例子:建立一個使用者定義的資料型別 ssn,其基於的系統資料型別是變長為11 的字元,不允許空。

Use cust
Exec sp_addtype ssn,'Varchar(11)',"Not Null'

例子:建立一個使用者定義的資料型別 birthday,其基於的系統資料型別是 DateTime,允許空。

Use cust
Exec sp_addtype birthday,datetime,'Null'

例子:建立兩個資料型別,即 telephone 和 fax

Use master
Exec sp_addtype telephone,'varchar(24),'Not Null'
Eexc sp_addtype fax,'varchar(24)','Null'

(2)刪除使用者定義的資料型別

當用戶定義的資料型別不需要時,可刪除。刪除使用者定義的資料型別的命令是

sp_droptype {'type'}

例子:

Use master
Exec sp_droptype 'ssn'

注意:當表中的列還正在使用使用者定義的資料型別時,或者在其上面還繫結有預設或者規則時,這種使用者定義的資料型別不能刪除。

九、參考:

SQL Server與CLR資料型別的對應關係

到此這篇關於SQL Server資料型別的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com