SQL Server之?dāng)?shù)據(jù)類型詳解

來源:博客園 阿赫瓦里


數(shù)據(jù)類型是一種屬性,用于指定對象可保存的數(shù)據(jù)的類型,SQL Server中支持多種數(shù)據(jù)類型,包括字符類型、數(shù)值類型以及日期類型等。數(shù)據(jù)類型相當(dāng)于一個容器,容器的大小決定了裝的東西的多少,將數(shù)據(jù)分為不同的類型可以節(jié)省磁盤空間和資源。
??SQL Server 還能自動限制每個數(shù)據(jù)類型的取值范圍,例如定義了一個類型為int的字段,如果插入數(shù)據(jù)時插入的值的大小在smallint或者tinyint范圍之內(nèi), Sql Server 會自動將類型轉(zhuǎn)換為smallint 或者tinyint,這樣一來,在存儲數(shù)據(jù)時,占用的存儲空間只有int的1/2或則1/4.
  SQL Server數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù)類型可以分為兩類,分別是:系統(tǒng)默認(rèn)的數(shù)據(jù)類型和用戶自定義的數(shù)據(jù)類型。下面分別介紹這兩大類數(shù)據(jù)類型的內(nèi)容.


一:系統(tǒng)數(shù)據(jù)類型

SQL Server 提供的系統(tǒng)數(shù)據(jù)類型有一下幾大類,共25種。 SQL Server會自動限制每個系統(tǒng)數(shù)據(jù)類型的取值范圍,當(dāng)插入數(shù)據(jù)庫中的值超過了數(shù)據(jù)允許的范圍時,SQL Server 就會報錯。

1.整數(shù)數(shù)據(jù)類型

整數(shù)數(shù)據(jù)類型是常用的數(shù)據(jù)類型之一,主要用于存儲數(shù)值,可以直接進行數(shù)據(jù)運算而不必使用函數(shù)轉(zhuǎn)換.
(1).bigint
??每個bigint存儲在8個字節(jié)中,其中一個二進制位表示符號位,其它63個二進制位表示長度和大小,可以表示-2的63次方~2的63次方-1范圍內(nèi)的所有整數(shù)。
(2).int
? int或者integer,每個int存儲在4個字節(jié)中,其中一個二進制位表示符號位,其它31個二進制位表示長度和大小,,可以表示-2的31次方~2的31次方-1范圍內(nèi)的所有整數(shù)。
(3).smallint
? 每個smallint類型的數(shù)據(jù)占用了兩個字節(jié)的存儲空間,其中一個二進制位表示整數(shù)值的正負號,其它15個二進制位表示長度和大小,,可以表示-2的15次方~2的15次方-1范圍內(nèi)的所有整數(shù)。
(4).tinyint
??每個tinyint類型的數(shù)據(jù)占用了一個字節(jié)的存儲空間,可以表示0~255范圍內(nèi)的所有整數(shù).

2.浮點數(shù)據(jù)類型

浮點數(shù)據(jù)類型存儲十進制小數(shù),用于表示浮點數(shù)值數(shù)據(jù)的大致數(shù)值數(shù)據(jù)類型。浮點數(shù)據(jù)為近似值;浮點數(shù)值的數(shù)據(jù)則Sql Server中采用了只入不舍的方式進行存儲,即當(dāng)且僅當(dāng)要舍入的數(shù)是一個非零數(shù)時,對其保留數(shù)字部分的最低有效位上加1,并進行必要的近位。
(1).real
??可以存儲正的或者負的十進制數(shù)值,它的存儲范圍從-3.40E+38-1.18E-38、0以及1.18E-383.40E+38.每個real類型的數(shù)據(jù)占用4個字節(jié)的存儲空間。
(2)float[(n)]
??其中為用于存儲float數(shù)值尾數(shù)的位數(shù)(以科學(xué)計數(shù)法表示),因此可以確定精度和存儲大小。如果指定了n它必須是介于1和53之間的某個值。n的默認(rèn)值為53.
??其范圍從-1.79E+308-2.23E-308、0以及2.23E+3081.79E-308。如果不指定數(shù)據(jù)類型float的長度,它占用8個字節(jié)的存儲空間。float數(shù)據(jù)類型可以寫成float(n)的形式,n為指定float數(shù)據(jù)的精度,n為153之間的整數(shù)值。當(dāng)n取124時,實際上定義了一個real類型的數(shù)據(jù),系統(tǒng)用4個自己存儲它。當(dāng)n取25~53時,系統(tǒng)認(rèn)為其是float類型,用8個字節(jié)存儲它。
(3).decimal[(p[,s])]和numeric[(p[,s])
??帶固定精度和小數(shù)位數(shù)的數(shù)值數(shù)據(jù)類型。使用最大精度時,有效值從-1038+1~1038-1。numeric在功能上等價于decimal。
??p(精度)指定了最多可以存儲十進制數(shù)字的總位數(shù),包括小數(shù)點左邊和右邊的位數(shù),該精度必須是從1到最大精度38之間的值,默認(rèn)精度為18.
??s(小數(shù)位數(shù))指定小數(shù)點右邊可以存儲的十進制數(shù)字的最大位數(shù),小數(shù)位數(shù)必須是從0到p之間的值,僅在指定精度后才可以指定小數(shù)的位數(shù)。默認(rèn)小數(shù)位數(shù)是0;因此,0<=s<=p。最大存儲大小基于精度而變化。例如:decimal(10,5)表示共有10位數(shù),其中整數(shù)5位,小數(shù)5位。

3.字符數(shù)據(jù)類型

字符數(shù)據(jù)類也是SQL Server中最常用的數(shù)據(jù)類型之一,用來存儲各種字符,數(shù)字符號和特殊符號。在使用字符數(shù)據(jù)類型時,需要在其前后加上英文單引號或者雙引號。
(1).char(n)
? 當(dāng)用char數(shù)據(jù)類型存儲數(shù)據(jù)時,每個字符和符號占用一個字節(jié)存儲空間,n表示所有字符所占的存儲空間,n的取值為1~8000。如不指定n的值,系統(tǒng)默認(rèn)n的值為1。若輸入數(shù)據(jù)的字符串長度小于n,則系統(tǒng)自動在其后添加空格來填滿設(shè)定好的空間;若輸入的數(shù)據(jù)過長,則會截掉其超出部分。
(2).varhcar(n|max)
? n為存儲字符的最大長度,其取值范圍是1~8000,但可根據(jù)實際存儲的字符數(shù)改變存儲空間,max表示最大存儲大小是2的31次方-1個字節(jié)。存儲大小是輸入數(shù)據(jù)的實際長度加2個字節(jié)。所輸入數(shù)據(jù)的長度可以為0個字符。如varchcar(20),則對應(yīng)的變量最多只能存儲20個字符,不夠20個字符的按實際存儲。
(3).nchar(n)
??n個字符的固定長度Unicode字符數(shù)據(jù)。n值必須在1~4000之間(含),如果沒有數(shù)據(jù)定義的或變量聲明語句中指定n,默認(rèn)長度為1。此數(shù)據(jù)類型采用Unicode字符集,因此每一個存儲單位占兩個字節(jié),可將全世界文字囊括在內(nèi)(當(dāng)然除了部分生僻字)。
(4).nvarchar(n|max)
? 與varchar類似,存儲可變長度Unicode字符數(shù)據(jù)。n值必須在1~4000之間(含),如果沒有數(shù)據(jù)定義的或變量聲明語句中指定n,默認(rèn)長度為1。max指最大存儲大小為2的31次方-1字節(jié)。存儲大小是輸入字符個數(shù)的兩倍+2個字節(jié)。所輸入的數(shù)據(jù)長度可以為0個字符.

4.日期和時間數(shù)據(jù)類型

(1).date
??存儲用字符串表示的日期數(shù)據(jù),可以表示0001-01-01~9999-12-31(公元元年1月1日到公元9999年12月31日)間的任意日期值。數(shù)據(jù)格式為“YYYY-MM-DD”:
YYYY:表示年份的四位數(shù)字,范圍為0001~9999;
MM:表示指定年份中月份的兩位數(shù)字,范圍為01~12;
DD:表示指定月份中某一天的兩位數(shù)字,范圍為01~31(最高值取決于具體月份)
該數(shù)據(jù)類型占用3個字節(jié)的空間。
(2).time
??以字符串形式記錄一天的某個時間,取值范圍為00:00:00.0000000~23:59:59.9999999,數(shù)據(jù)格式為“hh:mm:ss[.nnnnnnn]”:
hh:表示小時的兩位數(shù)字,范圍為0~23。
mm:表示分鐘的兩位數(shù)字,范圍為0~59。
ss:表示秒的兩位數(shù)字,范圍為0~59。
n*是07為數(shù)字,范圍為09999999,它表示秒的小部分.
time值在存儲時占用5個字節(jié)的空間。
(3).datetime
??用于存儲時間和日期數(shù)據(jù),從1753年1月1日到9999年12月31日,默認(rèn)值為1900-01-01 00:00:00,當(dāng)插入數(shù)據(jù)或在其它地方使用時,需用單引號或雙引號括起來??梢允褂谩?”、“-”和“.”作為分隔符。該類型數(shù)據(jù)占用8個字節(jié)的空間。
(4).datetime2
??datetime的擴展類型,其數(shù)據(jù)范圍更大,默認(rèn)的最小精度最高,并具有可選的用戶定義的精度。默認(rèn)格式為: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日,當(dāng)日期時間精度較小時,刻印使用smalldatetime,該類型數(shù)據(jù)占用4個字節(jié)的存儲空間。
(6).datetimeoffset
? 用于定義一個采用24小時制與日期相組合并可識別時區(qū)的時間。默認(rèn)格式是:“YYYY-MM-DD hh:mm:ss[.nnnnnnn][{+|-}hh:mm]”:
hh:兩位數(shù),范圍是-14~14
mm:兩位數(shù),范圍為00~59;
這里hh是時區(qū)偏移量,該類型數(shù)據(jù)中保存的是世界標(biāo)準(zhǔn)時間(UTC)值,eg:要存儲北京時間2011年11月11日12點整,存儲時該值將是2011-11-11 12:00:00+08:00,因為北京處于東八區(qū),比UTC早8個小時。存儲該數(shù)據(jù)類型數(shù)據(jù)時默認(rèn)占用10個字節(jié)大小的固定存儲空間.

5.文本和圖形數(shù)據(jù)類型

(1).text
? 用于存儲文本數(shù)據(jù),服務(wù)器代碼頁中長度可變的非Unicode數(shù)據(jù),最大長度為2的31次方-1(2147 483 647)個字符。當(dāng)服務(wù)器代碼頁使用雙字節(jié)字符時,存儲仍是2147 483 647字節(jié)。
(2)ntext
? 與text類型作用相同,為長度可變的非Unicode數(shù)據(jù),最大長度為2的30次方-1(1073 741 283)個字符。存儲大小是所輸入字符個數(shù)的兩倍(以字節(jié)為單位).
(3).image
? 長度可變的二進制數(shù)據(jù),范圍為:0~2的31次方-1個字節(jié)。用于存儲照片、目錄圖片或者圖畫,容量也是2147 483 647個字節(jié),由系統(tǒng)根據(jù)數(shù)據(jù)的長度自動分配空間,存儲該字段的數(shù)據(jù)一般不能使用insert語句直接輸入。

6.貨幣數(shù)據(jù)類型

(1).money
??用于存儲貨幣值,取值范圍為正負922 337 213 685 477.580 8之間。money數(shù)據(jù)類型中整數(shù)部分包含19個數(shù)字,小數(shù)部分包含4個數(shù)字,因此money數(shù)據(jù)類型的精度是19,存儲時占用8個字節(jié)的存儲空間。
(2).smallmoney
??與money類型相似,取值范圍為214 748.346 8之間,smallmoney存儲時占用4個字節(jié)存儲空間。輸入數(shù)據(jù)時在前面加上一個貨幣符號,如人民幣為¥或其它定義的貨幣符號。

7.位數(shù)據(jù)類型

bit稱為位數(shù)據(jù)類型,只取0或1為值,長度1字節(jié)。bit值經(jīng)常當(dāng)作邏輯值用于判斷true(1)或false(0),輸入非0值時系統(tǒng)將其替換為1。

8.二進制數(shù)據(jù)類型

(1)binary(n)
??長度為n個字節(jié)的固定長度二進制數(shù)據(jù),其中n是從1~8000的值。存儲大小為n個字節(jié)。在輸入binary值時,必須在前面帶0x,可以使用0xAA5代表AA5,如果輸入數(shù)據(jù)長度大于定于的長度,超出的部分會被截斷。
(2).varbinary(n|max)
??可變長度二進制數(shù)據(jù)。其中n是從1~8000的值,max指示存儲大小為2的31次方-1字節(jié)。存儲大小為所輸入數(shù)據(jù)的實際長度+2個字節(jié)。
??在定義的范圍內(nèi),不論輸入的時間長度是多少,binary類型的數(shù)據(jù)都占用相同的存儲空間,即定義時空間,而對于varbinary類型的數(shù)據(jù),在存儲時實際值的長度使用存儲空間.

9.其他數(shù)據(jù)類型

(1).rowversion
??每個數(shù)據(jù)都有一個計數(shù)器,當(dāng)對數(shù)據(jù)庫中包含rowversion列的表執(zhí)行插入或者更新操作時,該計數(shù)器數(shù)值就會增加。此計數(shù)器是數(shù)據(jù)庫行版本。一個表只能有一個rowversion列。每次修改或者插入包含rowversion列的行時,就會在rowversion列中插入經(jīng)過增量的數(shù)據(jù)庫行版本值。
??公開數(shù)據(jù)庫中自動生成的唯一二進制數(shù)字的數(shù)據(jù)類型。rowversion通常用作給表行加版本戳的機制。存儲大小為8個字節(jié)。rowversion數(shù)據(jù)類型只是遞增的數(shù)字,不保留日期或時間。
(2)timestamp
??時間戳數(shù)據(jù)類型,timestamp的數(shù)據(jù)類型為rowversion數(shù)據(jù)類型的同義詞,提供數(shù)據(jù)庫范圍內(nèi)的唯一值,反映數(shù)據(jù)修改的唯一順序,是一個單調(diào)上升的計數(shù)器,此列的值被自動更新。
??在create table或alter table 語句中不必為提么timestamp數(shù)據(jù)類型指定列名。
?  eg:create table testTable (id int primary key,timestamp );
此時Sql Server數(shù)據(jù)庫引擎將生成timestamp列名;但rowversion不具備這樣的行為,在使用rowversion時,必須指定列名.
(3).uniqueidentifier
??16字節(jié)的GUID(Globally Unique Identifier,全球唯一標(biāo)識符),是Sql Server根據(jù)網(wǎng)絡(luò)適配器地址和主機CPU時鐘產(chǎn)生的唯一號碼,其中,每個為都是09或af范圍內(nèi)的十六進制數(shù)字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF,此號碼可以通過newid()函數(shù)獲得,在全世界各地的計算機由次函數(shù)產(chǎn)生的數(shù)字不會相同。
(4).cursor
??游標(biāo)數(shù)據(jù)類型,該類型類似與數(shù)據(jù)表,其保存的數(shù)據(jù)中的包含行和列值,但是沒有索引,游標(biāo)用來建立一個數(shù)據(jù)的數(shù)據(jù)集,每次處理一行數(shù)據(jù)。
(5).sql_variant
??用于存儲除文本,圖形數(shù)據(jù)和timestamp數(shù)據(jù)外的其它任何合法的Sql Server數(shù)據(jù),可以方便Sql Server的開發(fā)工作。
(6).table
??用于存儲對表或視圖處理后的結(jié)果集。這種新的數(shù)據(jù)類型使得變量可以存儲一個表,從而使函數(shù)或過程返回查詢結(jié)果更加方便、快捷。
(7).xml
??存儲xml數(shù)據(jù)的數(shù)據(jù)類型??梢栽诹兄谢蛘選ml類型的變量中存儲xml實例。存儲的xml數(shù)據(jù)類型表示實例大小不能超過2GB。


二:自定義數(shù)據(jù)類型

SQl Server允許用戶自定義數(shù)據(jù)類型,用戶自定義數(shù)據(jù)類型是建立在SQL Server系統(tǒng)數(shù)據(jù)類型的基礎(chǔ)上的,自定義的數(shù)據(jù)類型使得數(shù)據(jù)庫開發(fā)人員能夠根據(jù)需要定義符合自己開發(fā)需求的數(shù)據(jù)類型。自定義數(shù)據(jù)類型雖然使用比較方便,但是需要大量的性能開銷,所以使用時要謹(jǐn)慎。當(dāng)用戶定義一種數(shù)據(jù)類型時,需要指定該類型的名稱、所基于的系統(tǒng)數(shù)據(jù)類型以及是否允許為空等。SQL Server為用戶提供了兩種方法來創(chuàng)建自定義數(shù)據(jù)類型。下面分別介紹這兩種個定義數(shù)據(jù)類型的方法。
(1).使用對象資源管理器創(chuàng)建用戶自定義數(shù)據(jù)類型
? 創(chuàng)建數(shù)據(jù)庫Test-->【可編程性】-->【類型】節(jié)點,右擊【用戶定義數(shù)據(jù)類型】節(jié)點,在彈出的框中,按照說明相應(yīng)操作即可。很簡單,就不截圖贅述了。
(2).使用存儲過程創(chuàng)建用戶自定義數(shù)據(jù)類型
? 觸雷使用圖形界面創(chuàng)建自定義數(shù)據(jù)類型,Sql Server中的系統(tǒng)存儲過程sp_addtype也可為用戶提供使用T_sql語句創(chuàng)建自定義數(shù)據(jù)類型的方法。其語法如下:
? sp_addtype [@typename= ] type,
? [@phystyle=] system_data_type
? [,[@nulltype =] 'null_type']
其中,各參數(shù)的含義如下:
type:用于指定用戶定義的數(shù)據(jù)類型的名稱。
system_data_type:用于指定相應(yīng)的系統(tǒng)提供的數(shù)據(jù)類型的名稱及定義。注意:未能使用timestamp數(shù)據(jù)類型,當(dāng)所使用的系統(tǒng)數(shù)據(jù)類型有額外的說明時,需要用引號將其括起來。
null_type:用于指定用戶自定義的的數(shù)據(jù)類型的null屬性,其值可為“null” 、“not null“或”notnull“。默認(rèn)時與系統(tǒng)默認(rèn)的null屬性相同。用戶自定義的數(shù)據(jù)類型的名稱在數(shù)據(jù)庫中應(yīng)該是唯一的。
eg:sp_addtype homeAddress 'varchar(120)','not null'
刪除用戶自定義數(shù)據(jù)類型:
a.用圖形界面刪除,不做贅述。
b.用系統(tǒng)存儲過程sp_droptype刪除. eg:sp_droptype homeAddress,其中homeAddress為用戶自定義數(shù)據(jù)類型名稱.
注意:數(shù)據(jù)庫正在使用的用戶自定義數(shù)據(jù)類型,不能被刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,306評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • SQL SELECT 語句 一、查詢SQL SELECT 語法 (1)SELECT 列名稱 FROM 表名稱 (2...
    有錢且幸福閱讀 5,992評論 0 33
  • “今天太冷,我想再放縱自己一天,還是從明天開始吧,明天我一定出去跑步!” “要不還是從明天開始吧,反正今天是糟糕的...
    明某某閱讀 303評論 0 0
  • 我坐在回家的大巴上,大巴上人極少,因為我的家比較偏僻,所以到我家的只有這一輛車,車?yán)飷灍?,讓人莫名的煩躁,?..
    味小姐閱讀 707評論 0 0

友情鏈接更多精彩內(nèi)容