在SQL Server 2008中使用T-SQL数据类型(三)

日期: 2008-10-28 作者:SearchSQLServer.com翻译:April 来源:TechTarget中国 英文

大对象数据库类型 大对象(LOBs)就是最大长度为2GB的数据对象。这些数据对象一般用来存储大型的文本数据、加载模块和音频/视频文件。T-SQL支持两种不同的指定和访问方式: 1、使用VARCHAR(MAX), NVARCHAR(MAX)和VARBINARY(MAX)的数据类型。 2、使用所谓的文本和图像数据类型。

MAX Specifier是从SQL Server 2005开始的,你能用相同的程序模式访问标准数据类型和LOBs的值,换句话说,你能用简单的系统函数和字符串进行对LOBs操作。 Database Engine用的是MAX分类符,包括以下数据类型:VARCHAR、NVARCHAR和……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

大对象数据库类型

大对象(LOBs)就是最大长度为2GB的数据对象。这些数据对象一般用来存储大型的文本数据、加载模块和音频/视频文件。T-SQL支持两种不同的指定和访问方式:

1、使用VARCHAR(MAX), NVARCHAR(MAX)和VARBINARY(MAX)的数据类型。

2、使用所谓的文本和图像数据类型。

MAX Specifier是从SQL Server 2005开始的,你能用相同的程序模式访问标准数据类型和LOBs的值,换句话说,你能用简单的系统函数和字符串进行对LOBs操作。

Database Engine用的是MAX分类符,包括以下数据类型:VARCHAR、NVARCHAR和VARBINARY定义可变长度列。当你使用MAX默认值(不是确切值时),系统分析这一特殊字符的长度并决定是否将该值当作LOB来存储。MAX分类符表示列值得大小能够达到目前系统的LOB最大值(在将来SQL Server版本中,MAX将可能有一个更大值。

尽管数据库系同决定如何存储LOB,你也可以通过使用sp_tableoption系统程序LARGE_ VALUE_TYPES_OUT_OF_ROW不考虑默认细则。如果选项值设为1,那么列中的数据显然就是用的MAX分类符,就会与其他的数据区分开进行单独保存。如果选项设定为0,Database Engine stores就保存了所有表示行大小的值,一般行数据<8060字节。

在SQL Server 2008中,你可以对VARBINARY(MAX)列申请新的FILESTREAM属性将大型binary数据直接存储在NTFS文件系统中。这一属性的主要优点就是相应的LOB大小仅仅受限于文件系统的列大小。

TEXT、NTEXT和IMAGE数据类型

TEXT、NTEXT和IMAGE数据类型组成了所谓的文本/图像数据类型。IMAGE类型的数据对象包含所有的数据(下载模块、音频/视频),而TEXT和NTEXT数据类型的数据对象包含在文本数据(也就是可打印的数据)。

文本/图像数据类型和数据库的其他值区别保存默认值,存储方式为使用指向该数据字段的B-树型结构(A B-树型结构就是如同树的数据结构,所有远离树根的底端节点数字相同)。而对于含有文本/图像数据类型的列来说,Database Engine在数据行中存储了16字节的指示器,指定能找到数据的地方。

如果文本/图像数据小于32KB,指示器就指向了B-树型结构中的根部节点,该节点长度约为84个字节。根部节点指向数据的物理模块。如果数据总量大于32KB,Database Engine就会在数据模块和根部节点建立中间节点。

由于每个表都包含一个以上有这种数据的列,列中的所有值都存储在一起。然而,一个物理页面能只包含单个表中的文本/图像数据。

虽然文本/图像数据是和所有其他数据分开保存的,你也可以用sp_tableoption系统程序的TEXT_IN_ROW选项进行修改。用这一选项你能指定最大字节数字,也可以让它和一般数据保存在一起。

文本/图像数据类型有很多局限性。你不能把它们当作本地变量(在存储程序或在T-SQL语句中)。同样,它们也不能作为索引的一部分、不能用在下列SELECT语句的子句中:WHERE、ORDER BY和GROUP BY。所有文本/图像数据类型最大的问题就是你必须使用特殊工具(READTEXT、WRITETEXT和 UPDATETEXT)对它进行操作。

注:文本/图像数据类型具有deprecated特征,并且会迁移到将来的Database Engine版本中,用VARCHAR(MAX)、NVARCHAR(MAX)和VARBINARY(MAX)代替。

UNIQUEIDENTIFIER数据类型

从它的名字来理解,UNIQUEIDENTIFIER数据类型值是唯一辨别数字,它是用16个字节存储的二进制字符串。数据类型和globally unique identifier(全球唯一识别码)密切相关,它保证了在世界范围内的唯一性。因此,通过运用数据类型,你能在分布式计算机系统中用非常独特的眼光识别数据和对象。

使用NEWID和NEWSEQUENTIALID函数可以进行列或UNIQUEIDENTIFIER类型的变量初始化,并且字符串常量是用十六进制数字和连字符这种特殊格式书写的。NEWID和NEWSEQUENTIALID函数在本章以后的系统函数这部分会讲到。
 
  在查询里用关键字ROWGUIDCOL 能够查看UNIQUEIDENTIFIER 数据类型列,并且指定包含ID值的列。这一关键字不能生成任何列。一个表中有多个UNIQUEIDENTIFIER列,但是只有一个列里包含ROWGUIDCOL关键字。

SQL_VARIANT数据类型

SQL_VARIANT数据类型用于同时存储各种数据类型,如数值、字符串以及日期值等等。只有TIMESTAMP类型值不能存储。SQL_VARIANT列中的每个值都有两部分:日期值和描述值的信息。这些信息包括数据类型的所有属性,如长度、范围和精确度。

T-SQL支持SQL_VARIANT_PROPERTY函数,它表示SQL_VARIANT列中每个值得附加信息。SQL_VARIANT数据类型的用法,查看第五章例5.5。

注:只有在非常必要的情况下才用SQL_VARIANT数据类型表中的列。如果这些值属于不同的数据类型或者在数据库设计过程中很难决定列中的数据类型,那么表中的列就应该包含这种数据类型。

HIERARCHYID数据类型

HIERARCHYID数据类型用于保存整个层面。它是作为Common Language Runtime(CLR)自定义类型安装的,包括一些层级节点上创建和操作的系统函数。以下的一些函数,属于这种数据类型:GetAncestor(), GetDescendant(), Read(), and Write()(有关这种数据类型的详细介绍不属于本章范围)。

TIMESTAMP数据类型

TIMESTAMP数据类型指定其中一栏为VARBINARY(8)或BINARY(8),这是由列中的无效值决定的。系统包含每个数据库的当前值(不是日期或时间),这样在插入或更新含有TIMESTAMP列这样的行时就自动增加了。

注:该值不能自动保存在TIMESTAMP列中。因为TIMESTAMP列常用于查看是否一个具体的行已经在上次访问的时候发生了变化。


  用VARDECIMAL 格式存储的DECIMAL数据库

DECIMAL数据类型一般以固定长度数据存储在磁盘上。自从SQL Server 2005 SP2以来,这种数据库就能用新的叫做VARDECIMAL存储格式以可变长度列存储。通过使用VARDECIMAL,你能大大减少DECIMAL列的存储空间,在这些列里的值的长度也大不相同。

注:VARDECIMAL是一种存储格式而不是一种数据类型。

当你需要指定最大可能值范围时VARDECIMAL存储格式就很有帮助,通常存储值要更小。 如表4-1表示:

精确度字节个数: VARDECIMAL字节个数: 固定长度
0 or NULL25
145
201213
301617
382017

注:VARDECIMAL存储格式和DECIMAL数据类型工作原理一样,都是包括文字和数字的VARCHAR数据类型。

表4-1为存储VARDECIMAL和固定长度的字节个数。

要启用VARDECIMAL存储格式,你首先要为数据库启用这种格式,然后为数据库特殊的表启用这种格式。sp_db_ vardecimal_storage_format系统程序用于第一步,如例4.6所示:

例4.6

EXEC sp_db_vardecimal_storage_format 'sample', 'ON';

sp_table选项系统程序中的VARDECIMAL STORAGE FORMAT选项常用于为该表开启这种存储格式。例4.7就为该项目表启用了VARDECIMAL存储格式。

例4.7


EXEC sp_tableoption 'project', 'vardecimal storage format', 1

就像你已经了解到的一样,用VARDECIMAL存储格式最主要的原因就是减少数据的存储大小。如果你想测试它能够获得多少存储空间,你可以用sys.sp_estimated_rowsize_reduction_for_vardecimal动态管理视图。这种管理视图能对这种表进行详细概算。

翻译

April
April

相关推荐