Sql Server之數據類型詳解

  數據類型是一種屬性,用於指定對象可保存的數據的類型,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-3八、0以及1.18E-38~3.40E+38.每一個real類型的數據佔用4個字節的存儲空間。
(2)float[(n)]
  其中爲用於存儲float數值尾數的位數(以科學計數法表示),所以能夠肯定精度和存儲大小。若是指定了n它必須是介於1和53之間的某個值。n的默認值爲53.
  其範圍從-1.79E+308~-2.23E-30八、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個字符.
ide

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語句直接輸入。
post

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。
spa

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語句建立自定義數據類型的方法。其語法以下:
 sp_addtype [@typename= ] type,
 [@phystyle=] system_data_type
 [,[@nulltype =] 'null_type']
其中,各參數的含義以下:
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爲用戶自定義數據類型名稱.
注意:數據庫正在使用的用戶自定義數據類型,不能被刪除。

 轉自:http://www.cnblogs.com/selene/

相關文章
相關標籤/搜索