SQL Server 2008数据类型
在创建表时,必须为表中的每列指派一种数据类型。本节将介绍SQL Server中最常用的一些数据类型。即使创建自定义数据类型,它也必须基于一种标准的SQL Server数据类型。例如,可以使用如下语法创建一种自定义数据类型(Address),但要注意,它基于SQL Server标准的varchar数据类型。
1.CREATE TYPE Address
2.FROM varchar(35) NOT NULL
如果在SQL Server Management Studio的表设计界面中更改一个大型表中某列的数据类型,那么该操作可能需要很长时间。可以通过在Management Studio界面中脚本化这种改
变来观察其原因。Management Studio再创建一个临时表,采用像tmpTableName这样的名称,然后将数据复制到该表中。最后,界面删除旧表并用新的数据类型重命名新表。当然,
此过程中还涉及其他一些用于处理表中索引和其他任何关系的步骤。
如果有一个包含数百万条记录的大型表,则该过程可能需要花费十分钟,有时可能是数小时。
为避免这种情况,可在查询窗口中使用简单的单行T-SQL语句来更改该列的数据类型。例如,要将Employees表中JobTitle列的数据类型改为varchar(70),可以使用如下语法。
1.ALTER TABLE HumanResources.Employee ALTER COLUMN JobTitle Varc
har(70)
说明:
在转换为与当前数据不兼容的数据类型时,可能丢失重要数据。例如,如果要将包含一些数据(如15.415)的numeric数据类型转换为integer数据类型,那么15.415这个数据将四舍五入为整数。
您可能想对SQL Server表编写一个报表,显示表中每列的数据类型。完成这项任务的方法有很多种,但最常见的一种方法是连接sys.objects表和lumns表。在下面的代码中,
有两个函数可能不太为您所熟悉。函数TYPE_NAME()将数据类型id转换为适当的名称。要
进行反向操作,可使用TYPE_ID()函数。需要注意的另一个函数是SCHEMA_ID(),它用于
返回架构的标识值。在需要编写有关SQL Server元数据的报表时,这是特别有用的。
1.SELECT o.name AS ObjectName,
2. c.name AS ColumnName,
3.TYPE_NAME(c.user_type_id) as DataType
4.FROM sys.objects o lumns c
5.ON o.object_id = c.object_id
6.WHERE o.name ='Department'
7.and o.Schema_ID = SCHEMA_ID('HumanResources')
该代码返回如下结果(注意,Name是一种用户定义的数据类型)。
1.ObjectName ColumnName DataType
2.---------------------------------------------------
3.Department DepartmentID smallint
4.Department Name
Name
5.Department GroupName Name
6.Department ModifiedDate
datetime
1. 字符数据类型
字符数据类型包括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 数据类型。
表1-1列出了这些类型,对其作了简单描述,并说明了要求的存储空间。
表1-1
数 据 类 型描 述
存 储 空 间
Char(n)
N 为1~8000字符之间
n 字节
Nchar(n)
N 为1~4000 Unicode 字符之间
(2n 字节)+2字
节额外开销
01628
Ntext
最多为230–1
(1 073 741 823)Unicode 字符
每字符2字节Nvarchar(max)最多为230–1
(1 073 741 823)Unicode 字符
2×字符数+2字节额外开销
Text
最多为231–1
(2 147 483 647)字符
每字符1字节Varchar(n)
N 为1~8000字符之间
每字符1字节+2
字节额外开销Varchar(max)
最多为231–1(2 147 483 647)字符每字符1字节+2
字节额外开销2. 精确数值数据类型
数值数据类型包括
bit 、tinyint 、smallint 、int 、bigint 、numeric 、decimal 、money 、float 以及real 。这些
数据类型都用于存储不同类型的数字值。第一种数据类型bit 只存储0或1,在大多数应用程
序中被转换为true 或false 。bit 数据类型非常适合用于开关标记,且它只占据一个字节空间。
其他常见的数值数据类型如表1-2所示。
表1-2
数 据 类 型描 述
存 储 空 间
bit
0、1或Null
1字节(8位)tinyint
0~255之间的整数
1字节
smallint
–32 768~32 767之间的整数
2字节
int
–2 147 483 648~
decimal是整数数据类型2 147 483 647之间的整数
4字节
bigint
–9 223 372 036 854 775 808~9 223 372 036 854 775 807
8字节
1 01628
之间的整数(续表)
数 据 类 型
描 述
存 储 空 间
numeric(p,s)或decimal(p,s)
–1 038+1~1 038–1之间的数值最多17字节
money
–922 337 203 685 477.580 8~922 337 203 685 477.580 7
8字节
smallmoney
–214 748.3648~2 14 748.36474字节
SQL Server 2008数据类型(2)
如decimal 和numeric 等数值数据类型可存储小数点右边或左边的变长位数。Scale 是小数点右边的位数。精度(Precision)定义了总位数,包括小数点右边的位数。例如,由于14.88531可为numeric(7,5)或decimal(7,5)。如果将14.25插入到numeric(5,1)列中,
它将被舍入为14.3。
3. 近似数值数据类型
这个分类中包括数据类型float 和real 。它们用于表示浮点数据。但是,由于它们是近似的,因此不能精确地表示所有值。
float(n)中的n 是用于存储该数尾数(mantissa)的位数。SQL Server 对此只使用两个值。如果指定位于1~24之间,SQL 就使用24。如果指定25~53之间,SQL 就使用53。当指定float()时(括号中为空),默认为53。
表1-3列出了近似数值数据类型,对其进行简单描述,并说明了要求的存储空间。
表1-3
数 据 类 型描 述
存 储 空 间
float[(n)]
–1.79E +308~–2.23E–
308,0,2.23E–308~1.79E +308N< =24-4字节
N> 24-8字节
real()
–3.40E +38~–1.18E–
4字节
01628
38,0,1.18E–38~3.40E+38
注意:
real的同义词为float(24)。
4. 二进制数据类型
如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大小的限制。
表1-4列出了二进制数据类型,对其作了简单描述,并说明了要求的存储空间。
表1-4
数据类型描述存储空间
Binary(n)N为1~8000十六进制数字之间n字节
Image最多为231–1
(2 147 483 647)十六进制数位
每字符1字节
Varbinary(n)N为1~8000十六进制数字之间每字符1字节
+2字节额外开销
Varbinary(max)最多为231–1
(2 147 483 647)十六进制数字每字符1字节
+2字节额外开销
5. 日期和时间数据类型
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联机丛书可到使用这些数据类型的示例。
1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论