Sql Server基礎:資料型別詳解

發表於2015-05-07

資料型別是一種屬性,用於指定物件可儲存的資料的型別,SQL Server中支援多種資料型別,包括字元型別、數值型別以及日期型別等。資料型別相當於一個容器,容器的大小決定了裝的東西的多少,將資料分為不同的型別可以節省磁碟空間和資源。

Sql Server 還能自動限制每個資料型別的取值範圍,例如定義了一個型別為int的欄位,如果插入資料時插入的值的大小在smallint或者tinyint範圍之內, Sql Server 會自動將型別轉換為smallint 或者tinyint,這樣一來,在儲存資料時,佔用的儲存空間只有int的1/2或則1/4.

Sql Server資料庫管理系統中的資料型別可以分為兩類,分別是:系統預設的資料型別和使用者自定義的資料型別。下面分別介紹這兩大類資料型別的內容.

一:系統資料型別

Sql Server 提供的系統資料型別有一下幾大類,共25種。 Sql Server會自動限制每個系統資料型別的取值範圍,當插入資料庫中的值 超過了資料允許的範圍時, Sql Server 就會報錯。
1.整數資料型別

整數資料型別是常用的資料型別之一,主要用於儲存數值,可以直接進行資料運算而不必使用函式轉換.

(1).bigint
每個bigint儲存在8個位元組中,其中一個二進位制位表示符號位,其它63個二進位制位表示長度和大小,可以表示-2的63次方~2的63次方-1範圍內的所有整數。

(2).int
int或者integer,每個int儲存在4個位元組中,其中一個二進位制位表示符號位,其它31個二進位制位表示長度和大小,,可以表示-2的31次方~2的31次方-1範圍內的所有整數。

(3).smallint
每個smallint型別的資料佔用了兩個位元組的儲存空間,其中一個二進位制位表示整數值的正負號,其它15個二進位制位表示長度和大小,,可以表示-2的15次方~2的15次方-1範圍內的所有整數。

(4).tinyint
每個tinyint型別的資料佔用了一個位元組的儲存空間,可以表示0~255範圍內的所有整數.

2.浮點資料型別

浮點資料型別儲存十進位制小數,用於表示浮點數值資料的大致數值資料型別。浮點資料為近似值;浮點數值的資料則Sql Server中採用了只入不捨的方式進行儲存,即當且僅當要舍入的數是一個非零數時,對其保留數字部分的最低有效位上加1,並進行必要的近位。

(1).real
可以儲存正的或者負的十進位制數值,它的儲存範圍從-3.40E+38~-1.18E-38、0以及1.18E-38~3.40E+38.每個real型別的資料佔用4個位元組的儲存空間。

(2)float[(n)]
其中為用於儲存float數值尾數的位數(以科學計數法表示),因此可以確定精度和儲存大小。如果指定了n它必須是介於1和53之間的某個值。n的預設值為53.
其範圍從-1.79E+308~-2.23E-308、0以及2.23E+308~1.79E-308。如果不指定資料型別float的長度,它佔用8個位元組的儲存空間。float資料型別可以寫成float(n)的形式,n為指定float資料的精度,n為1~53之間的整數值。當n取1~24時,實際上定義了一個real型別的資料,系統用4個自己儲存它。當n取25~53時,系統認為其是float型別,用8個位元組儲存它。

(3).decimal[(p[,s])]和numeric[(p[,s])
帶固定精度和小數位數的數值資料型別。使用最大精度時,有效值從-10^38+1~10^38-1。numeric在功能上等價於decimal。

p(精度)指定了最多可以儲存十進位制數字的總位數,包括小數點左邊和右邊的位數,該精度必須是從1到最大精度38之間的值,預設精度為18.

s(小數位數)指定小數點右邊可以儲存的十進位制數字的最大位數,小數位數必須是從0到p之間的值,僅在指定精度後才可以指定小數的位數。預設小數位數是0;因此,0<=s<=p。最大儲存大小基於精度而變化。例如:decimal(10,5)表示共有10位數,其中整數5位,小數5位。

3.字元資料型別

字元資料類也是Sql Server中最常用的資料型別之一,用來儲存各種字元,數字符號和特殊符號。在使用字元資料型別時,需要在其前後加上英文單引號或者雙引號。

(1)char(n)
當用char資料型別儲存資料時,每個字元和符號佔用一個位元組儲存空間,n表示所有字元所佔的儲存空間,n的取值為1~8000。如不指定n的值,系統預設n的值為1。若輸入資料的字串長度小於n,則系統自動在其後新增空格來填滿設定好的空間;若輸入的資料過長,則會截掉其超出部分。

(2). varhcar(n|max)
n為儲存字元的最大長度,其取值範圍是1~8000,但可根據實際儲存的字元數改變儲存空間,max表示最大儲存大小是2的31次方-1個位元組。儲存大小是輸入資料的實際長度加2個位元組。所輸入資料的長度可以為0個字元。如varchcar(20),則對應的變數最多隻能儲存20個字元,不夠20個字元的按實際儲存。

(3).nchar(n)
n個字元的固定長度Unicode字元資料。n值必須在1~4000之間(含),如果沒有資料定義的或變數宣告語句中指定n,預設長度為1。此資料型別採用Unicode字符集,因此每一個儲存單位佔兩個位元組,可將全世界文字囊括在內(當然除了部分生僻字)。

(4)nvarchar(n|max)
與varchar類似,儲存可變長度Unicode字元資料。n值必須在1~4000之間(含),如果沒有資料定義的或變數宣告語句中指定n,預設長度為1。max指最大儲存大小為2的31次方-1位元組。儲存大小是輸入字元個數的兩倍+2個位元組。所輸入的資料長度可以為0個字元.

4.日期和時間資料型別

(1).date
儲存用字串表示的日期資料,可以表示0001-01-01~9999-12-31(公元元年1月1日到公元9999年12月31日)間的任意日期值。資料格式為“YYYY-MM-DD”:

YYYY:表示年份的四位數字,範圍為0001~9999;
MM:表示指定年份中月份的兩位數字,範圍為01~12;DD:表示指定月份中某一天的兩位數字,範圍為01~31(最高值取決於具體月份)

該資料型別佔用3個位元組的空間。

(2).time

以字串形式記錄一天的某個時間,取值範圍為00:00:00.0000000~23:59:59.9999999,資料格式為“hh:mm:ss[.nnnnnnn]”:

hh:表示小時的兩位數字,範圍為0~23。
mm:表示分鐘的兩位數字,範圍為0~59。
ss:表示秒的兩位數字,範圍為0~59。
n*是0~7為數字,範圍為0~9999999,它表示秒的小部分.

time值在儲存時佔用5個位元組的空間。

(3).datetime

用於儲存時間和日期資料,從1753年1月1日到9999年12月31日,預設值為1900-01-01 00:00:00,當插入資料或在其它地方使用時,需用單引號或雙引號括起來。可以使用“/”、“-”和“.”作為分隔符。該型別資料佔用8個位元組的空間。

(4).datetime2

datetime的擴充套件型別,其資料範圍更大,預設的最小精度最高,並具有可選的使用者定義的精度。預設格式為:YYYY-MM-DD hh:mm:ss[.fractional seconds],日期的存取範圍是0001-01-01~9999-12-31(公元元年1月1日到公元9999年12月31日).

(5).smalldatetime

smalldatetime型別與datetime型別相似,只是其儲存範圍是從1900年1月1日到2079年6月6日,當日期時間精度較小時,刻印使用smalldatetime,該型別資料佔用4個位元組的儲存空間。

(6).datetimeoffset

用於定義一個採用24小時制與日期相組合並可識別時區的時間。預設格式是:“YYYY-MM-DD hh:mm:ss[.nnnnnnn][{+|-}hh:mm]”:

hh:兩位數,範圍是-14~14
mm:兩位數,範圍為00~59;
這裡hh是時區偏移量,該型別資料中儲存的是世界標準時間(UTC)值,eg:要儲存北京時間2011年11月11日12點整,儲存時該值將是2011-11-11 12:00:00+08:00,因為北京處於東八區,比UTC早8個小時。儲存該資料型別資料時預設佔用10個位元組大小的固定儲存空間.

5.文字和圖形資料型別

(1).text
用於儲存文字資料,伺服器內碼表中長度可變的非Unicode資料,最大長度為2的31次方-1(2147 483 647)個字元。當伺服器內碼表使用雙位元組字元時,儲存仍是2147 483 647位元組。

(2)ntext
與text型別作用相同,為長度可變的非Unicode資料,最大長度為2的30次方-1(1073 741 283)個字元。儲存大小是所輸入字元個數的兩倍(以位元組為單位).

(3).image
長度可變的二進位制資料,範圍為:0~2的31次方-1個位元組。用於儲存照片、目錄圖片或者圖畫,容量也是2147 483 647個位元組,由系統根據資料的長度自動分配空間,儲存該欄位的資料一般不能使用insert語句直接輸入。

6.貨幣資料型別

(1).money
用於儲存貨幣值,取值範圍為正負922 337 213 685 477.580 8之間。money資料型別中整數部分包含19個數字,小數部分包含4個數字,因此money資料型別的精度是19,儲存時佔用8個位元組的儲存空間。

(2).smallmoney
與money型別相似,取值範圍為214 748.346 8之間,smallmoney儲存時佔用4個位元組儲存空間。輸入資料時在前面加上一個貨幣符號,如人民幣為¥或其它定義的貨幣符號。

7.位資料型別

bit稱為位資料型別,只取0或1為值,長度1位元組。bit值經常當作邏輯值用於判斷true(1)或false(0),輸入非0值時系統將其替換為1。

8.二進位制資料型別

(1)binary(n)
長度為n個位元組的固定長度二進位制資料,其中n是從1~8000的值。儲存大小為n個位元組。在輸入binary值時,必須在前面帶0x,可以使用0xAA5代表AA5,如果輸入資料長度大於定於的長度,超出的部分會被截斷。

(2).varbinary(n|max)
可變長度二進位制資料。其中n是從1~8000的值,max指示儲存大小為2的31次方-1位元組。儲存大小為所輸入資料的實際長度+2個位元組。
在定義的範圍內,不論輸入的時間長度是多少,binary型別的資料都佔用相同的儲存空間,即定義時空間,而對於varbinary型別的資料,在儲存時實際值的長度使用儲存空間.

9.其他資料型別

(1).rowversion
每個資料都有一個計數器,當對資料庫中包含rowversion列的表執行插入或者更新操作時,該計數器數值就會增加。此計數器是資料庫行版本。一個表只能有一個rowversion列。每次修改或者插入包含rowversion列的行時,就會在rowversion列中插入經過增量的資料庫行版本值。
公開資料庫中自動生成的唯一二進位制數字的資料型別。rowversion通常用作給錶行加版本戳的機制。儲存大小為8個位元組。rowversion資料型別只是遞增的數字,不保留日期或時間。

(2)timestamp
時間戳資料型別,timestamp的資料型別為rowversion資料型別的同義詞,提供資料庫範圍內的唯一值,反映資料修改的唯一順序,是一個單調上升的計數器,此列的值被自動更新。
在create table或alter table 語句中不必為提麼timestamp資料型別指定列名。
eg:create table testTable (id int primary key,timestamp );
此時Sql Server資料庫引擎將生成timestamp列名;但rowversion不具備這樣的行為,在使用rowversion時,必須指定列名.

(3).uniqueidentifier
16位元組的GUID(Globally Unique Identifier,全球唯一識別符號),是Sql Server根據網路介面卡地址和主機CPU時鐘產生的唯一號碼,其中,每個為都是0~9或a~f範圍內的十六進位制數字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF,此號碼可以通過newid()函式獲得,在全世界各地的計算機由次函式產生的數字不會相同。

(4).cursor
遊標資料型別,該型別類似與資料表,其儲存的資料中的包含行和列值,但是沒有索引,遊標用來建立一個資料的資料集,每次處理一行資料。

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

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

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

二:自定義資料型別

Sql Server允許使用者自定義資料型別,使用者自定義資料型別是建立在Sql Server系統資料型別的基礎上的,自定義的資料型別使得資料庫開發人員能夠根據需要定義符合自己開發需求的資料型別。自定義資料型別雖然使用比較方便,但是需要大量的效能開銷,所以使用時要謹慎。當使用者定義一種資料型別時,需要指定該型別的名稱、所基於的系統資料型別以及是否允許為空等。Sql Server為使用者提供了兩種方法來建立自定義資料型別。下面分別介紹這兩種個定義資料型別的方法。

(1).使用物件資源管理器建立使用者自定義資料型別
建立資料庫Test–>【可程式設計性】–>【型別】節點,右擊【使用者定義資料型別】節點,在彈出的框中,按照說明相應操作即可。很簡單,就不截圖贅述了。

(2).使用儲存過程建立使用者自定義資料型別
觸雷使用圖形介面建立自定義資料型別,Sql Server中的系統儲存過程sp_addtype也可為使用者提供使用T_sql語句建立自定義資料型別的方法。其語法如下:

其中,各引數的含義如下:
type:用於指定使用者定義的資料型別的名稱。
system_data_type:用於指定相應的系統提供的資料型別的名稱及定義。注意:未能使用timestamp資料型別,當所使用的系統資料型別有額外的說明時,需要用引號將其括起來。
null_type:用於指定使用者自定義的的資料型別的null屬性,其值可為“null” 、“not null“或”notnull“。預設時與系統預設的null屬性相同。使用者自定義的資料型別的名稱在資料庫中應該是唯一的。
eg:sp_addtype homeAddress ‘varchar(120)’,’not null’

刪除使用者自定義資料型別:
a.用圖形介面刪除,不做贅述。
b.用系統儲存過程sp_droptype刪除. eg:sp_droptype homeAddress,其中homeAddress為使用者自定義資料型別名稱.
注意:資料庫正在使用的使用者自定義資料型別,不能被刪除。

相關文章