2023年11月27日发(作者:)
SQLSERVER数据类型详解(SQLServer2008)
数据类型类别
SQL Server 中的数据类型归纳为下列类别:
数字类型
字符串类型
在 SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组:
⼤值数据类型:varchar(max)、nvarchar(max) 和 varbinary(max)
⼤型对象数据类型:text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max) 和 xml
1.精确数字
如decimal和numeric等数值数据类型可存储⼩数点右边或左边的变长位数。Scale是⼩数点右边的位数。精度(Precision)定义了总位数,包
括⼩数点右边的位数。例如,由于14.88531可为numeric(7,5)或decimal(7,5)。如果将14.25插⼊到numeric(5,1)列中,它将被舍⼊为14.3。
数 据 类 型描 述注释
存 储
空 间
bit0、1或Null的整数数据类型
SQL Server 数据库引擎可优化 bit 列的存储。如果表
中的列为 8 bit 或更少,则这些列作为 1 个字节存储。
1字节
如果列为 9 到 16 bit,则这些列作为 2 个字节存储,
(8位)
以此类推。
字符串值 TRUE 和 FALSE 可以转换为以下 bit 值:
TRUE 转换为 1,FALSE 转换为 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 数据类型时,函数才返回
bigint。SQL Server 不会⾃动将其他整数数据类型
(tinyint、smallint 和 int)提升为 bigint。
decimal[ (p[
固定精度和⼩数位数。使⽤最⼤精度时,有效值从 - 10^38 +1
,s] )]
到 10^38 - 1。decimal 的 ISO 同义词为 dec 和 dec(p, s)。
numeric 在功能上等价于 decimal。p(精度)
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.近似数字
⽤于表⽰浮点数值数据的⼤致数值数据类型。浮点数据为近似值;因此,并⾮数据类型范围内的所有值都能精确地表⽰。
这个分类中包括数据类型float和real。它们⽤于表⽰浮点数据。但是,由于它们是近似的,因此不能精确地表⽰所有值。
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 - 308、0 以及 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 - 38、0 以及 1.18E - 38 ⾄ 3.40E + 384 字节real 的 ISO 同义词为 float(24)。
3.⽇期和时间类型
对于新的⼯作,请使⽤ time、date、datetime2 和 datetimeoffset 数据类型。这些类型符合 SQL 标准。它们更易于移植。time、datetime2
和 datetimeoffset 提供更⾼精度的秒数。datetimeoffset 为全局部署的应⽤程序提供时区⽀持。
datetime和smalldatetime数据类型⽤于存储⽇期和时间数据。smalldatetime为4字节,存储1900年1⽉1⽇~2079年6⽉6⽇之间的时间,且只
精确到最近的分钟。datetime数据类型为8字节,存储1753年1⽉1⽇~9999年12⽉31⽇之间的时间,且精确到最近的3.33毫秒。
SQL Server 2008有4种与⽇期相关的新数据类型:datetime2、dateoffset、date和time。通过SQL Server联机丛书可找到使⽤这些数据类型
的⽰例。
datetime2数据类型是datetime数据类型的扩展,有着更⼴的⽇期范围。时间总是⽤时、分钟、秒形式来存储。可以定义末尾带有可变参数的
datetime2数据类型--如datetime2(3)。这个表达式中的3表⽰存储时秒的⼩数精度为3位,或0.999。有效值为0~9之间,默认值为3。
datetimeoffset数据类型和datetime2数据类型⼀样,带有时区偏移量。该时区偏移量最⼤为+/-14⼩时,包含了UTC偏移量,因此可以合理
化不同时区捕捉的时间。
date数据类型只存储⽇期,这是⼀直需要的⼀个功能。⽽time数据类型只存储时间。它也⽀持time(n)声明,因此可以控制⼩数秒的粒度。与
datetime2和datetimeoffset⼀样,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个字节
1、3 字节整数存储⽇期。
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. 字符数据类型
字符数据类型包括varchar、char、nvarchar、nchar、text以及ntext。这些数据类型⽤于存储字符数据。varchar和char类型的主要区别是数
据填充。如果有⼀表列名为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列,除⾮确实有需要
使⽤它们的业务或语⾔需求。
接下来要提的数据类型是text和ntext。text数据类型⽤于在数据页内外存储⼤型字符数据。应尽可能少地使⽤这两种数据类型,因为可能影响
性能但可在单⾏的列中存储多达2GB的数据。与text数据类型相⽐,更好的选择是使⽤varchar(max)类型,因为将获得更好的性能。另
外,text和ntext数据类型在SQL Server的⼀些未来版本中将不可⽤,因此现在开始还是最好使⽤varchar(max)和nvarchar(max)⽽不是text和
ntext数据类型。
数 据 类 型描 述存 储 空 间注释
固定长度,如果没有在数据定义或变量声明语句中指定 n,则默
Char(n)n字节
n取值:1~8000
char的ISO同义词:
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)
varchar的ISO同义词:
char varying或character
varying
nchar(n)
固定长度,Unicode字符串如果没有在数据定义或变量声明语句中指定 n,则默
数据,认长度为 1。如果没有使⽤ CAST 函数指定 n,则默
n取值:1~40002n(每字符2字节)
char的ISO同义词:n(排序规则代码页使⽤双字节字符时)
national char或national
character
认长度为 30。
如果列数据项的⼤⼩可能相同,请使⽤ nchar。
如果列数据项的⼤⼩可能差异很⼤,请使⽤
nvarchar。
sysname 是系统提供的⽤户定义数据类型,除了不
可为空值外,在功能上与 nvarchar(128) 相
同。sysname ⽤于引⽤数据库对象名。
为使⽤ nchar 或 nvarchar 的对象分配的是默认的数
据库排序规则,但可使⽤ COLLATE ⼦句分配特定的
排序规则。
SET ANSI_PADDING ON 永远适⽤于 nchar 和
nvarchar。SET ANSI_PADDING OFF 不适⽤于
nchar 或 nvarchar 数据类型。
可变长度,Unicode字符串
数据,
n取值:1~4000
max最⼤存储为⼤⼩是:
nvarchar(n|max)
2^31-1 个字节 (2 GB)2n(每字符2字节)+2字节
nvarchar的ISO同义词:
national char varying、
national character varying
长度可变的 Unicode 数
据,字符串最⼤长度为
2^30 - 1 (1,073,741,823)
个字节。
ntext 的 ISO 同义词为
national text。
ntext
存储⼤⼩是所输⼊字符串长度的两倍
(以字节为单位)
5.⼆级制类型
如varbinary、binary、varbinary(max)或image等⼆进制数据类型⽤于存储⼆进制数据,如图形⽂件、Word⽂档或MP3⽂件。其值为⼗六进
制的0x0~0xf。image数据类型可在数据页外部存储最多2GB的⽂件。image数据类型的⾸选替代数据类型是varbinary(max),可保存最多
8KB的⼆进制数据,其性能通常⽐image数据类型好。SQL Server 2008的新功能是可以在操作系统⽂件中通过FileStream存储选项存储
varbinary(max)对象。这个选项将数据存储为⽂件,同时不受varbinary(max)的2GB⼤⼩的限制。
数 据 类 型描 述存 储 空 间注释
固定长度,
binary(n)n取值:1~8000n字节
char的ISO同义词: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字节
可能包含任何系统数据类 型的值,除了text、ntext、 image、timestamp、xml、 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,它在尺⼨上像text或ntext⼀样存储。XML数据类型使⽤特殊构造体进⾏
搜索和索引。第15章将更详细地介绍这些内容。
7. CLR集成
在SQL Server 2008中,还可使⽤公共语⾔运⾏库(Common Language Runtime,CLR)创建⾃⼰的数据类型和存储过程。这让⽤户可以使⽤
Visual Basic或C#编写更复杂的数据类型,以满⾜业务需求。这些类型被定义为基本的CLR语⾔中的类结构。


发布评论