資料類型
在 Microsoft SQL Server 中,每個列、局部變數、運算式和參數都有一個相關的資料類型,這是指定對象可持有的資料類型(整型、字元、money 等等)的特性。SQL Server 提供系統資料類型集,定義了可與 SQL Server 一起使用的所有資料類型。下面列出系統提供的資料類型集。
可以定義使用者定義的資料類型,其是系統提供的資料類型的別名。有關使用者定義的資料類型的更多資訊,請參見 sp_addtype 和建立使用者定義的資料類型。
當兩個具有不同資料類型、定序、精度、小數位元或長度的運算式通過運算子進行組合時:
通過將資料類型的優先順序規則應用到輸入運算式的資料類型來確定所得值的資料類型。有關更多資訊,請參見資料類型的優先順序。
如果結果資料類型為 char、varchar、text、nchar、nvarchar 或 ntext,則結果值的定序由定序的優先順序規則決定。有關更多資訊,請參見定序的優先順序。
結果的精度、小數位元及長度取決於輸入運算式的精度、小數位元及長度。有關更多資訊,請參見精度、小數位元和長度。
SQL Server 為 SQL-92 相容性提供了資料類型同義字。有關更多資訊,請參見資料類型同義字。FcPw~ O ^
G[1$nwww.tzsy.cn
精確數字
整數
int、bigint、smallint 和 tinyint
使用整數資料的精確數字資料類型。
bigint
從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型資料(所有數字)。儲存大小為 8 個位元組。
int
從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型資料(所有數字)。儲存大小為 4 個位元組。int 的 SQL-92 同義字為 integer。
smallint
從 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型資料。儲存大小為 2 個位元組。
tinyint
從 0 到 255 的整型資料。儲存大小為 1 位元組。
注釋
在支援整數值的地方支援 bigint 資料類型。但是,bigint 用於某些特殊的情況,當整數值超過 int 資料類型支援的範圍時,就可以採用 bigint。在 SQL Server 中,int 資料類型是主要的整數資料類型。
在資料類型優先次序表中,bigint 位於 smallmoney 和 int 之間。
只有當參數運算式是 bigint 資料類型時,函數才返回 bigint。SQL Server 不會自動將其它整數資料類型(tinyint、smallint 和 int)提升為 bigint。
bit
整型資料 1、0 或 NULL。
注釋
不能對 bit 類型的列使用索引。
Microsoft SQL Server 最佳化用於 bit 列的儲存。如果一個表中有不多於 8 個的 bit 列,這些列將作為一個位元組儲存。如果表中有 9 到 16 個 bit 列,這些列將作為兩個位元組儲存。更多列的情況依此類推。
decimal 和 numeric
帶定點精度和小數位元的 numeric 資料類型。
decimal[(p[, s])] 和 numeric[(p[, s])]
定點精度和小數位元。使用最大精度時,有效值從 - 10^38 +1 到 10^38 - 1。decimal 的 SQL-92 同義字是 dec 和 dec(p, s)。
p(精度)
指定小數點左邊和右邊可以儲存的十進位數位最大個數。精度必須是從 1 到最大精度之間的值。最大精度為 38。
s(小數位元)
指定小數點右邊可以儲存的十進位數位最大個數。小數位元必須是從 0 到 p 之間的值。預設小數位元是 0,因而 0 <= s <= p。最大儲存大小基於精度而變化。
精度儲存位元組數
1 - 9 5
10-19 9
20-28 13
29-38 17
money 和 smallmoney
代表貨幣或現金值的貨幣資料類型。
money
貨幣資料值介於 -2^63 (-922,337,203,685,477.5808) 與 2^63 - 1 (+922,337,203,685,477.5807) 之間,精確到貨幣單位的千分之十。儲存大小為 8 個位元組。
smallmoney
貨幣資料值介於 -214,748.3648 與 +214.748,3647 之間,精確到貨幣單位的千分之十。儲存大小為 4 個位元組。
近似數字
float 和 real
用於表示浮點數字資料的近似數字資料類型。浮點數據為近似值;並非資料類型範圍內的所有資料都能精確地表示。
文法
float [ ( n ) ]
從 - 1.79E + 308 到 1.79E + 308 之間的浮點數字資料。n 為用於儲存科學記號標記法 float 數尾數的位元,同時指示其精度和儲存大小。n 必須為從 1 到 53 之間的值。
n 所在範圍 精度 儲存大小
1-24 7 位元 4 位元組
25-53 15 位元 8 位元組
Microsoft SQL Server float[(n)] 資料類型對於從 1 到 53 之間的所有 n 值均符合 SQL-92 標準。double precision 的同義字為 float(53)。
real
從 3.40E + 38 到 3.40E + 38 之間的浮點數字資料。儲存大小為 4 位元組。在 SQL Server 中,real 的同義字為 float(24)。
datetime 和 smalldatetime
代表日期和一天內的時間的日期和時間資料類型。
datetime
從 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和時間資料,精確度為百分之三秒(等於 3.33 毫秒或 0.00333 秒)。如下表所示,把值調整到 .000、.003、或 .007 秒的增量。
樣本 調整後的樣本
01/01/98 23:59:59.999 1998-01-02 00:00:00.000
01/01/98 23:59:59.995,
01/01/98 23:59:59.996,
01/01/98 23:59:59.997, 或
01/01/98 23:59:59.998 1998-01-01 23:59:59.997
01/01/98 23:59:59.992,
01/01/98 23:59:59.993,
01/01/98 23:59:59.994 1998-01-01 23:59:59.993
01/01/98 23:59:59.990 或
01/01/98 23:59:59.991 1998-01-01 23:59:59.990
Microsoft SQL Server 拒絕所有其不能識別為 1753 年到 9999 年間的日期的值。
smalldatetime
從 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和時間資料精確到分鐘。29.998 秒或更低的 smalldatetime 值向下舍入為最接近的分鐘,29.999 秒或更高的 smalldatetime 值向上舍入為最接近的分鐘。
--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO
注釋
Microsoft SQL Server 用兩個 4 位元組的整數內部儲存 datetime 資料類型的值。第一個 4 位元組儲存 base date(即 1900 年 1 月 1 日)之前或之後的天數。基礎日期是系統參考日期。不允許早於 1753 年 1 月 1 日的 datetime 值。另外一個 4 位元組儲存以午夜後毫秒數所代表的每天的時間。
smalldatetime 資料類型儲存日期和每天的時間,但精確度低於 datetime。SQL Server 將 smalldatetime 的值儲存為兩個 2 位元組的整數。第一個 2 位元組儲存 1900 年 1 月 1 日後的天數。另外一個 2 位元組儲存午夜後的分鐘數。日期範圍從1900 年 1 月 1 日到 2079 年 6 月 6 日,精確到分鐘。
字串
char 和 varchar
固定長度 (char) 或可變長度 (varchar) 字元資料類型。
char[(n)]
長度為 n 個位元組的固定長度且非 Unicode 的字元資料。n 必須是一個介於 1 和 8,000 之間的數值。儲存大小為 n 個位元組。char 在 SQL-92 中的同義字為 character。
varchar[(n)]
長度為 n 個位元組的可變長度且非 Unicode 的字元資料。n 必須是一個介於 1 和 8,000 之間的數值。儲存大小為輸入資料的位元組的實際長度,而不是 n 個位元組。所輸入的資料字元長度可以為零。varchar 在 SQL-92 中的同義字為 char varying 或 character varying。
注釋
如果沒有在資料定義或變數聲明語句中指定 n,則預設長度為 1。如果沒有使用 CAST 函數指定 n,則預設長度為 30。
將為使用 char 或 varchar 的對象被指派資料庫的預設定序,除非用 COLLATE 子句另外指派了特定的定序。該定序控制用於儲存字元資料的字碼頁。
支援多語言的網站應考慮使用 Unicode nchar 或 nvarchar 資料類型以盡量減少字元轉換問題。如果使用 char 或 varchar:
如果希望列中的資料值大小接近一致,請使用 char。
如果希望列中的資料值大小顯著不同,請使用 varchar。
如果執行 CREATE TABLE 或 ALTER TABLE 時 SET ANSI_PADDING 為 OFF,則一個定義為 NULL 的 char 列將被作為 varchar 處理。
當定序字碼頁使用雙位元組字元時,儲存大小仍然為 n 個位元組。根據字串的不同,n 個位元組的儲存大小可能小於 n 個字元。
ntext
可變長度 Unicode 資料,其最大長度為 2^30 - 1 (1,073,741,823) 個字元。(請參見 ntext、text 和 image。)
ntext、text 和 image
用於儲存大型非 Unicode 字元、Unicode 字元及位元據的固定長度和可變長度資料類型。Unicode 資料使用 UNICODE UCS-2 字元集。
ntext
可變長度 Unicode 資料的最大長度為 230 - 1 (1,073,741,823) 個字元。儲存大小是所輸入字元個數的兩倍(以位元組為單位)。ntext 在 SQL-92 中的同義字是 national text。
text
伺服器字碼頁中的可變長度非 Unicode 資料的最大長度為 231-1 (2,147,483,647) 個字元。當伺服器字碼頁使用雙位元組字元時,儲存量仍是 2,147,483,647 位元組。儲存大小可能小於 2,147,483,647 位元組(取決於字串)。
image
可變長度位元據介於 0 與 231-1 (2,147,483,647) 位元組之間。
二進位字串
binary 和 varbinary
固定長度 (binary) 的或可變長度 (varbinary) 的 binary 資料類型。
binary [ ( n ) ]
固定長度的 n 個位元組位元據。N 必須從 1 到 8,000。儲存空間大小為 n+4 位元組。
varbinary [ ( n ) ]
n 個位元組變長位元據。n 必須從 1 到 8,000。儲存空間大小為實際輸入資料長度 +4 個位元組,而不是 n 個位元組。輸入的資料長度可能為 0 位元組。在 SQL-92 中 varbinary 的同義字為 binary varying。
image
可變長度的位元據,其最大長度為 2^31 - 1 (2,147,483,647) 個位元組。(請參見 ntext、text 和 image。)
注釋
如果在資料定義或變數聲明語句中沒有指定 n,預設長度為 1。如果沒有用 CAST 函數指定 n,預設長度為 30。
當列資料項目大小一致時應使用 binary。
當列資料項目大小不一致時應使用 varbinary。
其它資料類型
cursor
這是變數或預存程序 OUTPUT 參數的一種資料類型,這些參數包含對遊標的引用。使用 cursor 資料類型建立的變數可以為空白。
有些操作可以引用那些帶有 cursor 資料類型的變數和參數,這些操作包括:
DECLARE @local_variable 和 SET @local_variable 語句。
OPEN、FETCH、CLOSE 及 DEALLOCATE 遊標語句。
預存程序輸出參數。
CURSOR_STATUS 函數。
sp_cursor_list、sp_describe_cursor、sp_describe_cursor_tables 以及 sp_describe_cursor_columns 系統預存程序。
#重要 對於 CREATE TABLE 語句中的列,不能使用 cursor 資料類型。
sql_variant
一種儲存 SQL Server 支援的各種資料類型(text、ntext、image、timestamp 和 sql_variant 除外)值的資料類型。
sql_variant 可以用在列、參數和變數中並返回使用者定義函數的值。sql_variant 允許這些資料庫物件支援其它資料類型的值。
文法
sql_variant
注釋
sql_variant 類型的列可以包含不同資料類型的行。例如,定義為 sql_variant 的列可以儲存 int、binary 和 char 值。不能使用 sql_variant 儲存的實值型別只有 text、ntext、image、timestamp 和 sql_variant。
sql_variant 的最大長度可達 8016 位元組。
必須先將 sql_variant 資料類型投影為其基礎資料型別 (Elementary Data Type)值,才能使其參與加和減這類運算。
可以給 sql_variant 賦一個預設值。該資料類型還可以將 NULL 作為其基礎值,但是 NULL 值沒有關聯的基本類型。另外,sql_variant 還可以不將其它 sql_variant 作為其基本類型。
UNIQUE、主鍵或外鍵可以包含 sql_variant 類型列,但是包含給定行鍵的資料值總長度不應大於索引的最大長度(目前是 900 位元組)。
表可以有任意多個 sql_variant 列。
sql_variant 不能在 CONTAINSTABLE 和 FREETEXTTABLE 中使用。
ODBC 不完全支援 sql_variant。因此,當使用用於 ODBC 的 Microsoft OLE DB 提供者 (MSDASQL) 時,sql_variant 列的查詢作為位元據返回。例如,包含字串資料 'PS2091' 的 sql_variant 列作為 0x505332303931 返回。
table
一種特殊的資料類型,用於儲存結果集以供後續處理。該資料類型主要用於臨時儲存一組行,這些行將作為資料表值函式的結果集返回。
注釋
可將函數和變數聲明為 table 類型。table 變數可用於函數、預存程序和批處理中。
儘可能使用表變數而不使用暫存資料表。table 變數有以下優點:
table 變數的行為類似於局部變數,有明確定義的範圍。該範圍為聲明該變數的函數、預存程序或批處理。
在其範圍內,table 變數可像常規表那樣使用。該變數可應用於 SELECT、INSERT、UPDATE 和 DELETE 語句中用到表或表的運算式的地方。但是,table 不能用在下列語句中:
INSERT INTO table_variable EXEC 預存程序。
SELECT select_list INTO table_variable 語句。
在定義 table 變數的函數、預存程序或批處理結束時,自動清除 table 變數。
在預存程序中使用表變數與使用暫存資料表相比,減少了預存程序的重新編譯量。
涉及表變數的事務只在表變數更新期間存在。這樣就減少了表變數對鎖定和記錄資源的需求。
不支援在表變數之間進行賦值操作。另外,由於表變數範圍有限,並且不是持久資料庫的一部分,因而不受交易回復的影響。
timestamp
timestamp 這種資料類型表現自動產生的位元,確保這些數在資料庫中是唯一的。timestamp 一般用作給表行加版本戳的機制。儲存大小為 8 位元組。
注釋
Transact-SQL timestamp 資料類型與在 SQL-92 標準中定義的 timestamp 資料類型不同。SQL-92 timestamp 資料類型等價於 Transact-SQL datetime 資料類型。
Microsoft SQL Server 將來的版本可能會修改 Transact-SQL timestamp 資料類型的行為,使它與在標準中定義的行為一致。到那時,當前的 timestamp 資料類型將用 rowversion 資料類型替換。
Microsoft SQL Server 2000 引入了 timestamp 資料類型的 rowversion 同義字。在 DDL 語句中儘可能使用 rowversion 而不使用 timestamp。rowversion 受資料類型同義字行為的制約。有關更多資訊,請參見資料類型同義字。
在 CREATE TABLE 或 ALTER TABLE 語句中,不必為 timestamp 資料類型提供列名:
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp)
如果沒有提供列名,SQL Server 將產生 timestamp 的列名。rowversion 資料類型同義字不具有這樣的行為。指定 rowversion 時必須提供列名。
一個表只能有一個 timestamp 列。每次插入或更新包含 timestamp 列的行時,timestamp 列中的值均會更新。這一屬性使 timestamp 列不適合作為鍵使用,尤其是不能作為主鍵使用。對行的任何更新都會更改 timestamp 值,從而更改索引值。如果該列屬於主鍵,那麼舊的索引值將無效,進而引用該舊值的外鍵也將不再有效。如果該表在動態資料指標中引用,則所有更新均會更改遊標中行的位置。如果該列屬於索引鍵,則對資料行的所有更新還將導致索引更新。
不可為空白的 timestamp 列在語義上等價於 binary(8) 列。可為空白的 timestamp 列在語義上等價於 varbinary(8) 列。
uniqueidentifier
通用唯一識別碼 (GUID)。
注釋
uniqueidentifier 資料類型的列或局部變數可用兩種方法初始化為一個值:
使用 NEWID 函數。
將字串常量轉換為如下形式(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每個 x 是 0-9 或 a-f 範圍內的一個十六進位的數字)。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF 即為有效 uniqueidentifier 值。
比較子可與 uniqueidentifier 值一起使用。然而,排列並非通過比較兩個值的位元模式來實現。允許對 uniqueidentifier 值執行的操作只有比較 (=, <>, <, >, <=, >=) 和檢查 NULL(IS NULL 和 IS NOT NULL)。不允許使用其它算術運算子。所有的列約束及屬性(IDENTITY 除外)均允許用於 uniqueidentifier 資料類型。