2023年11月27日发(作者:)

SQLSERVER数据类型详解(SQLServer2008

数据类型类别

SQL Server 中的数据类型归纳为下列类别:

数字类型

字符串类型

SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组:

⼤值数据类型:varchar(max)nvarchar(max) varbinary(max)

⼤型对象数据类型:textntextimagevarchar(max)nvarchar(max)varbinary(max) xml

1.精确数字

decimalnumeric等数值数据类型可存储⼩数点右边或左边的变长位数。Scale是⼩数点右边的位数。精度(Precision)定义了总位数,包

括⼩数点右边的位数。例如,由于14.88531可为numeric(7,5)decimal(7,5)。如果将14.25插⼊到numeric(5,1)列中,它将被舍⼊为14.3

注释

bit01Null的整数数据类型

SQL Server 数据库引擎可优化 bit 列的存储。如果表

中的列为 8 bit 或更少,则这些列作为 1 个字节存储。

1字节

如果列为 9 16 bit,则这些列作为 2 个字节存储,

(8)

以此类推。

字符串值 TRUE FALSE 可以转换为以下 bit 值:

TRUE 转换为 1FALSE 转换为 0

bigint8 字节

int-2^31 (-2,147,483,648) 2^31-1 (2,147,483,647)4字节

smallint-2^15 (-32,768) 2^15-1 (32,767)2字节

-2^63 (-9,223,372,036,854,775,808) 2^63-1int 数据类型是 SQL Server 中的主要整数数据类

(9,223,372,036,854,775,807)

型。bigint 数据类型⽤于整数值可能超过 int 数据类型

⽀持范围的情况。

在数据类型优先次序表中,bigint 介于 smallmoney

int 之间。

tinyint0 2551字节

只有当参数表达式为 bigint 数据类型时,函数才返回

bigintSQL Server 不会⾃动将其他整数数据类型

tinyintsmallint int)提升为 bigint

decimal[ (p[

固定精度和⼩数位数。使⽤最⼤精度时,有效值从 - 10^38 +1

,s] )]

10^38 - 1decimal ISO 同义词为 dec dec(p, s)

numeric 在功能上等价于 decimalp(精度)

numeric[ (p[

,s] )]s(⼩数位数)

最多可以存储的⼗进制数字的总位数,包括⼩数点左边和右边的

位数。该精度必须是从 1 到最⼤精度 38 之间的值。默认精度为

1 -

5

18

9

⼩数点右边可以存储的⼗进制数字的最⼤位数。⼩数位数必须是

0 p 之间的值。仅在指定精度后才可以指定⼩数位数。默认

的⼩数位数为 0;因此,0 <= s <= p。最⼤存储⼤⼩基于精度⽽

变化。

10-

9

19

20-

13

28

29-

17

38

money-922,337,203,685,477.5808 922,337,203,685,477.58078字节

smallmoney-214,748.3648 214,748.36474字节

money smallmoney 数据类型精确到它们所代表的

货币单位的万分之⼀。

2.近似数字

⽤于表⽰浮点数值数据的⼤致数值数据类型。浮点数据为近似值;因此,并⾮数据类型范围内的所有值都能精确地表⽰。

这个分类中包括数据类型floatreal。它们⽤于表⽰浮点数据。但是,由于它们是近似的,因此不能精确地表⽰所有值。

float(n)中的n是⽤于存储该数尾数(mantissa)的位数。SQL Server对此只使⽤两个值。如果指定位于1~24之间,SQL就使⽤24。如果指定

25~53之间,SQL就使⽤53。当指定float()(括号中为空),默认为53

注释

取决于 n

其中 n 为⽤于存储 float 数值尾数的位数(以科学记数法表⽰),因此可

以确定精度和存储⼤⼩。如果指定了 n,则它必须是介于 1 53 之间的

n

float

某个值。n 的默认值为 53

value

[ (n)

]

74

-1.79E + 308 -2.23E - 3080 以及 2.23E - 308 1.79E + 3081-24

SQL Server n 视为下列两个可能值之⼀。如

1<=n<=24,则将 n 视为 24。如果

25<=n<=53,则将 n 视为 53

SQL Server float[(n)] 数据类型从 1 53 之间

的所有 n 值均符合 ISO 标准。double precision

的同义词为 float(53)

158

25-53

real-3.40E + 38 -1.18E - 380 以及 1.18E - 38 3.40E + 384 字节real ISO 同义词为 float(24)

3.⽇期和时间类型

对于新的⼯作,请使⽤ timedatedatetime2 datetimeoffset 数据类型。这些类型符合 SQL 标准。它们更易于移植。timedatetime2

datetimeoffset 提供更⾼精度的秒数。datetimeoffset 为全局部署的应⽤程序提供时区⽀持。

datetimesmalldatetime数据类型⽤于存储⽇期和时间数据。smalldatetime4字节,存储190011~207966⽇之间的时间,且只

精确到最近的分钟。datetime数据类型为8字节,存储175311~99991231⽇之间的时间,且精确到最近的3.33毫秒。

SQL Server 20084种与⽇期相关的新数据类型:datetime2dateoffsetdatetime。通过SQL Server联机丛书可找到使⽤这些数据类型

的⽰例。

datetime2数据类型是datetime数据类型的扩展,有着更⼴的⽇期范围。时间总是⽤时、分钟、秒形式来存储。可以定义末尾带有可变参数的

datetime2数据类型--datetime2(3)。这个表达式中的3表⽰存储时秒的⼩数精度为3位,或0.999。有效值为0~9之间,默认值为3

datetimeoffset数据类型和datetime2数据类型⼀样,带有时区偏移量。该时区偏移量最⼤为+/-14⼩时,包含了UTC偏移量,因此可以合理

化不同时区捕捉的时间。

date数据类型只存储⽇期,这是⼀直需要的⼀个功能。⽽time数据类型只存储时间。它也⽀持time(n)声明,因此可以控制⼩数秒的粒度。与

datetime2datetimeoffset⼀样,n可为0~7之间。

00:00:00.0000000 23:59:59.9999999

精确度:100纳秒

字符长度:最⼩ 8 (hh:mm:ss),最⼤ 16

(hh:mm:n)

0001-01-01 9999-12-31

字符长度:10

注释

3~5字节 time

date

固定3个字节

13 字节整数存储⽇期。

4字节smalldatetime

2007-5-9 23:59:59 将被

舍为 2007-5-10 00:00:00精确度:1分钟

⽇期范围:1900-01-01 2079-06-06

时间范围:00:00:00 23:59:59

字符长度:最⾼ 19

⽇期范围:1753-1-1 9999-12-31

datetime8字节

⽇期范围:1753-1-1 9999-12-31

时间范围:00:00:00 -23:59:59.997

精确度:0.00333

字符长度:最低 19 位到最⾼ 23

0001-01-01 00:00:00.0000000 9999-12-31

23:59:59.99999996~8字节

精确度:100纳秒

⽇期范围:0001-01-01 00:00:00.0000000 9999-12-31

23:59:59.9999999(以 UTC

时间表⽰)8~10字节

datetimeoffset

时间范围:00:00:00 23:59:59.9999999默认值为 10 个字节的固定⼤⼩,默

精确度:100纳秒认的秒的⼩数部分精度为 100ns

字符长度:最低 26 (YYYY-MM-DD hh:mm:ss {+|-}hh:mm)

到最⾼ 34 (YYYY-MM-DD hh:mm:n {+|-}hh:mm)

4. 字符数据类型

字符数据类型包括varcharcharnvarcharnchartext以及ntext。这些数据类型⽤于存储字符数据。varcharchar类型的主要区别是数

据填充。如果有⼀表列名为FirstName且数据类型为varchar(20),同时将值Brian存储到该列中,则物理上只存储5个字节。但如果在数据类

型为char(20)的列中存储相同的值,将使⽤全部20个字节。SQL将插⼊拖尾空格来填满20个字符。

如果要节省空间,那么为什么还使⽤char数据类型呢?使⽤varchar数据类型会稍增加⼀些系统开销。例如,如果要存储两字母形式的州名缩

写,则最好使⽤char(2)列。尽管有些DBA认为应最⼤可能地节省空间,但⼀般来说,好的做法是在组织中找到⼀个合适的阈值,并指定低于

该值的采⽤char数据类型,反之则采⽤varchar数据类型。通常的原则是,任何⼩于或等于5个字节的列应存储为char数据类型,⽽不是

varchar数据类型。如果超过这个长度,使⽤varchar数据类型的好处将超过其额外开销。

nvarchar数据类型和nchar数据类型的⼯作⽅式与对等的varchar数据类型和char数据类型相同,但这两种数据类型可以处理国际性的

Unicode字符。它们需要⼀些额外开销。以Unicode形式存储的数据为⼀个字符占两个字节。如果要将值Brian存储到nvarchar列,它将使⽤

10个字节;⽽如果将它存储为nchar(20),则需要使⽤40字节。由于这些额外开销和增加的空间,应该避免使⽤Unicode列,除⾮确实有需要

使⽤它们的业务或语⾔需求。

接下来要提的数据类型是textntexttext数据类型⽤于在数据页内外存储⼤型字符数据。应尽可能少地使⽤这两种数据类型,因为可能影响

性能但可在单⾏的列中存储多达2GB的数据。与text数据类型相⽐,更好的选择是使⽤varchar(max)类型,因为将获得更好的性能。另

外,textntext数据类型在SQL Server的⼀些未来版本中将不可⽤,因此现在开始还是最好使⽤varchar(max)nvarchar(max)⽽不是text

ntext数据类型。

注释

固定长度,如果没有在数据定义或变量声明语句中指定 n,则默

Char(n)n字节

n取值:1~8000

charISO同义词:

character

认长度为 1。如果在使⽤ CAST CONVERT 函数

时未指定 n,则默认长度为 30

将为使⽤ char varchar 的对象指派数据库的默认

排序规则,除⾮使⽤ COLLATE ⼦句指派了特定的排

序规则。该排序规则控制⽤于存储字符数据的代码

页。

如果站点⽀持多语⾔,请考虑使⽤

Unicode nchar nvarchar 数据类型,以最⼤限度地

消除字符转换问题。如果使⽤ char varchar,建议

执⾏以下操作:可变长度,

每字符1字节+2

如果列数据项的⼤⼩⼀致,则使⽤ char

字节额外开销

如果列数据项的⼤⼩差异相当⼤,则使

varchar

如果列数据项⼤⼩相差很⼤,⽽且⼤⼩可能超

8,000 字节,请使⽤ varchar(max)

当执⾏ CREATE TABLE ALTER TABLE 时,如

SET ANSI_PADDING OFF,则定义为 NULL

char 列将作为 varchar 处理。

服务器代码页中长度可变当服务器代码页使⽤双字节字符时,存

的⾮Unicode数据,储仍是 2,147,483,647 字节。根据字符

最⼤长度: 2^31-1串,存储⼤⼩可能⼩于 2,147,483,647

(2,147,483,647) 个字节

固定长度,Unicode字符串如果没有在数据定义或变量声明语句中指定 n,则默

text

节。

n取值:1~8000

max最⼤存储⼤⼩是:

Varchar(n|max)

2^31-1 个字节 (2 GB)

varcharISO同义词:

char varyingcharacter

varying

nchar(n)

固定长度,Unicode字符串如果没有在数据定义或变量声明语句中指定 n,则默

数据,认长度为 1。如果没有使⽤ CAST 函数指定 n,则默

n取值:1~40002n(每字符2字节)

charISO同义词:n(排序规则代码页使⽤双字节字符时)

national charnational

character

认长度为 30

如果列数据项的⼤⼩可能相同,请使⽤ nchar

如果列数据项的⼤⼩可能差异很⼤,请使⽤

nvarchar

sysname 是系统提供的⽤户定义数据类型,除了不

可为空值外,在功能上与 nvarchar(128)

同。sysname ⽤于引⽤数据库对象名。

为使⽤ nchar nvarchar 的对象分配的是默认的数

据库排序规则,但可使⽤ COLLATE ⼦句分配特定的

排序规则。

SET ANSI_PADDING ON 永远适⽤于 nchar

nvarcharSET ANSI_PADDING OFF 不适⽤于

nchar nvarchar 数据类型。

可变长度,Unicode字符串

数据,

n取值:1~4000

max最⼤存储为⼤⼩是:

nvarchar(n|max)

2^31-1 个字节 (2 GB)2n(每字符2字节)+2字节

nvarcharISO同义词:

national char varying

national character varying

长度可变的 Unicode

据,字符串最⼤长度为

2^30 - 1 (1,073,741,823)

个字节。

ntext ISO 同义词为

national text

ntext

存储⼤⼩是所输⼊字符串长度的两倍

(以字节为单位)

5.⼆级制类型

varbinarybinaryvarbinary(max)image等⼆进制数据类型⽤于存储⼆进制数据,如图形⽂件、Word⽂档或MP3⽂件。其值为⼗六进

制的0x0~0xfimage数据类型可在数据页外部存储最多2GB的⽂件。image数据类型的⾸选替代数据类型是varbinary(max),可保存最多

8KB的⼆进制数据,其性能通常⽐image数据类型好。SQL Server 2008的新功能是可以在操作系统⽂件中通过FileStream存储选项存储

varbinary(max)对象。这个选项将数据存储为⽂件,同时不受varbinary(max)2GB⼤⼩的限制。

注释

固定长度,

binary(n)n取值:1~8000n字节

charISO同义词:character

如果没有在数据定义或变量声明语句中指定 n,则默

认长度为 1。如果没有使⽤ CAST 函数指定 n,则默

认长度为 30

如果列数据项的⼤⼩⼀致,则使⽤ binary

可变长度,

存储⼤⼩为所输⼊数据的实际长度 +

n取值:1~8000

2 个字节。所输⼊数据的长度可以是

如果列数据项的⼤⼩差异相当⼤,则使⽤ varbinary

max最⼤存储⼤⼩是:2^31-1

0 字节

varbinary(n|max)

当列数据条⽬超出 8,000 字节时,请使⽤

个字节 (2 GB)

varbinary(max)

varbinary ANSI SQL 同义

词为 binary varying

image

长度可变的⼆进制数据,从 0

2^31-1 (2,147,483,647)

字节。

6. 其他系统数据类型

Cursor

可以只⽤作变量或存储过程参数

1~892

字节+

2

字节的

额外开

SQL_Variantnvarchar(max) varbinary (max)sql_variant 及⽤户定义的数据类型。最⼤尺 ⼨为8000字节数据+16字节

可能包含任何系统数据类 型的值,除了textntext imagetimestampxml varchar(max)

8016

(或元数据)

取决于

包含⼀个对光标的引⽤和

不适⽤

Hierarchyid包含⼀个对层次结构中位置的引⽤

取决于

表定

Table

⽤于存储⽤于进⼀步处理的数 据集。定义类似于Create Table 主要⽤于返回表值函数的结果集, 它们也可⽤

义和存

于存储过程和批处理中

储的⾏

对于每个表来说是唯⼀的、⾃ 动存储的值。通常⽤于版本戳, 该值在插⼊和每次更新时⾃动改变8字节

Timestamp or

Rowversion

Uniqueidentifier16字节

XML可以以Unicode或⾮Unicode形式存储

可以包含全局唯⼀标识符 (Globally Unique Identifier GUID)guid值可以从Newid() 函数获得。这个函数返回

的值对 所有计算机来说是唯⼀的。 尽管存储为16位的⼆进制值, 但它显⽰为char(36)

最多

2GB

注意:

cursor数据类型可能不⽤于Create Table语句中。

hierarchyid列是SQL Server 2008中新出现的。您可能希望将这种数据类型的列添加到这样的表中--其表⾏中的数据可⽤层次结构表⽰,就像

组织层次结构或经理/雇员层次结构⼀样。存储在该列中的值是⾏在层次结构中的路径。层次结构中的级别显⽰为斜杠。斜杠间的值是这个成

员在⾏中的数字级别,如/1/3。可以运⽤⼀些与这种数据类型⼀起使⽤的特殊函数。

XML数据存储XML⽂档或⽚段。根据⽂档中使⽤UTF-16或是UTF-8,它在尺⼨上像textntext⼀样存储。XML数据类型使⽤特殊构造体进⾏

搜索和索引。第15章将更详细地介绍这些内容。

7. CLR集成

SQL Server 2008中,还可使⽤公共语⾔运⾏库(Common Language RuntimeCLR)创建⾃⼰的数据类型和存储过程。这让⽤户可以使⽤

Visual BasicC#编写更复杂的数据类型,以满⾜业务需求。这些类型被定义为基本的CLR语⾔中的类结构。