天天看點

第四節:SQLServer資料類型詳解

一. 系統資料類型

前言: 

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

  Sql Server 還能自動限制每個資料類型的取值範圍,例如定義了一個類型為int的字段,如果插入資料時插入的值的大小在smallint或者tinyint範圍之内, Sql Server 會自動将類型轉換為smallint 或者tinyint,這樣一來,在存儲資料時,占用的存儲空間隻有int的1/2或則1/4。

1. 整數類型

(1). bigint

  每個bigint存儲在8個位元組中,其中1個二進制位表示符号位,其它63個二進制位表示長度和大小,可以表示    -2^63------2^63-1   範圍内的所有整數。

PS:位元組就是我們常說的Byte,簡寫:B; 位是計算機内部資料儲存的最小機關,就是bit; 一個位元組由8個二進制位構成,即 1Byte=8bit 。

(2). int

  每個int存儲在4個位元組中,其中1個二進制位表示符号位,其它31個二進制位表示長度和大小,,可以表示   -2^31------2^31-1  範圍内的所有整數。 

(3). smallint

  每個smallint類型的資料占用了2個位元組的存儲空間,其中1個二進制位表示整數值的正負号,其它15個二進制位表示長度和大小,,可以表示  -2^15------2^15-1   範圍内的所有整數。 

(4). tinyint

  每個tinyint類型的資料占用了1個位元組的存儲空間,可以表示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

  其中為用于存儲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,4)表示共有10位數,其中整數6位,小數4位。 

3. 字元串類型

(1). char(n)

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

(2). varchar(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字元集,是以每1個存儲機關占2個位元組,可将全世界文字囊括在内(當然除了部分生僻字)。

(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”,該資料類型占用3個位元組的空間。 

  YYYY:表示年份的四位數字,範圍為0001~9999; 

  MM:表示指定年份中月份的兩位數字,範圍為01~12; 

  DD:表示指定月份中某一天的兩位數字,範圍為01~31(最高值取決于具體月份) 

(2).time 

  以字元串形式記錄一天的某個時間,取值範圍為00:00:00.0000000~23:59:59.9999999,資料格式為“hh:mm:ss[.nnnnnnn]”: 存儲時占用5個位元組的空間。 

  hh:表示小時的兩位數字,範圍為0~23。 

  mm:表示分鐘的兩位數字,範圍為0~59。 

  ss:表示秒的兩位數字,範圍為0~59。 

  n*是0~7為數字,範圍為0~9999999,它表示秒的小部分. 

(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-->【可程式設計性】-->【類型】節點,右擊【使用者定義資料類型】節點,在彈出的框中,按照說明相應操作即可。很簡單,就不截圖贅述了。 

第四節:SQLServer資料類型詳解
第四節:SQLServer資料類型詳解

(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為使用者自定義資料類型名稱. 

注意:資料庫正在使用的使用者自定義資料類型,不能被删除。

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 部落格位址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 如有錯誤,歡迎讨論,請勿謾罵^_^。
  • 聲     明2 : 原創部落格請在轉載時保留原文連結或在文章開頭加上本人部落格位址,否則保留追究法律責任的權利。