当前位置: 首页 > 知识 >正文

sql server数据类型有哪些(sql server中数据类型)

开始很简单。MegaWare公司的市场部想要一个新的网站来发布文档,开发团队认为使用sql server 2000数据库作为文档存储仓库会使事情变得更简单。

MegaWare的数据库管理员史蒂夫认为没有什么大问题。将文档存储在数据库中而不是使用文件系统意味着服务器需要做更多的工作,但这也使备份和管理更加容易。

数据库和文件系统也不可能变得不同步。

市场部门想要存储的许多文档都超过了8000字节,所以很明显VARCHAR不是适合这项工作的数据类型。相反,文本数据类型用于定义存储数据的字段。因为每个文本可以容纳2GB的内容,

文本存储市场部同事扔进数据库的最大文件也没问题。

几个月后,市场用大量无聊的拷贝填满了整个数据库。但这不是史蒂夫真正关心的。数据库愉快地嗡嗡作响,每个人都对项目的结果感到满意。

直到公司口号改变的大日子。

营销团队认为“MegaWare:真的很酷!”比原来的“这是MegaWare的方式或高速公路!”听起来好多了。

因为营销团队已经在仓库中的每个文档的页脚中嵌入了原始标语,所以现在Steve的工作是更改所有这些文档的页脚。

“没问题,”史蒂夫想。他打开了SQL Server查询分析器工具,并执行了以下T-SQL批处理:

UPDATE MarketingDocuments

SET Document=

REPLACE(Document,

'It''s MegaWare''s Way or the Highway!',

'MegaWare: It''s really cool!)

当他看到错误信息时,史蒂夫轻松的笑容很快消失了。替换函数的参数1,文本数据类型无效。

编写替换函数时,它对文本数据类型没有影响。它也不适用于CHARINDEX或SUBSTRING,——,或者至少它们不适用于超过8000个字符。此外,

开发人员忘记处理文本或图像类型的局部变量;实际上不支持任何操作。即使只是简单地更新文档中的子字符串,也需要一些晦涩的东西和函数,比如READTEXT和WRITETEXT,它们很难使用。

相反,开发人员或忙碌的数据库管理员花费时间使用不同类型的函数,以找出如何正确使用它们。

SQL Server的开发者是幸运的,他们会冲破乌云,看到蓝天。Sql server 2005引入了一系列名为MAX的新数据类型。这是VARCHAR、NVARCHAR和VARBINARY类型的扩展。

这些类型以前被限制在8000字节以下。MAX最多可以容纳2GB的数据,——像文本和图片,完全兼容SQL Server的所有内置字符串函数。

用MAX关键字定义某种MAX类型的变量就像替换字符串(当它是VARCHAR/NVARCHAR时)或字节(当它是VARBINARY时)的大小一样简单。

DECLARE @BigString VARCHAR(MAX)

SET @BigString='abc'

虽然这个变量可以自由操作,并可以传递给任何内置的字符串函数,但兼容性并不是没有问题。首先,

开发人员不能指望指定大小的VARCHAR和VARBINARY变量在达到8000字节的限制时会自动“升级”到MAX版本。例如,下面的批处理:

DECLARE @String1 VARCHAR(4001)

DECLARE @String2 VARCHAR(4001)

SET @String1=REPLICATE('1', 4001)

SET @String2=REPLICATE('2', 4001)

SELECT LEN(@String1 + @String2)

4001+4001=8002,但是指定了尺寸的VARCHAR的极限是8000。因为这两个变量中没有一个是MAX类型,LEN函数的结果就是8000,不是8002。在将两个变量连接的时候,

一种简单的修正方法就是声明这两个变量中的一个为VARCHAR(MAX)或者将其中的一个变量进行转换。与一个规定了尺寸的类型进行连接的时候,优先考虑MAX类型,最终结果是MAX类型。所以,

以下批处理的结果是8002,正如我们期望的一样:

DECLARE @String1 VARCHAR(4001)

DECLARE @String2 VARCHAR(4001)

SET @String1=REPLICATE('1', 4001)

SET @String2=REPLICATE('2', 4001)

SELECT LEN(CONVERT(VARCHAR(MAX), @String1) + @String2)

在传递给字符串函数的时候,开发人员意识到字符串的原意在默认情况下是规定了尺寸的,而不是MAX类型,也是至关重要的。例如,以下查询的结果就很令人惊奇:

SELECT LEN(REPLICATE('1', 8002))

因为字符串‘1’是被作为规定了尺寸的VARCHAR对待,而不是VARCHAR(MAX),结果就是8000——但是在SQL Server 2005中,

REPLICATE函数能够产生高达2GB的字符串。要修正这个问题,可以将字符串转换为VARCHAR(MAX),这样函数就会输出同样的类型了:

SELECT LEN(REPLICATE(CONVERT(VARCHAR(MAX), '1'), 8002))

这个查询现在将会返回期望的结果:8002。记住,总是要对采用了新特性编写的代码进行非常仔细的测试;隐藏的问题,例如上面描述的问题,可能并且毫无疑问地会在最坏的时间里造成灾难性的后果。

除了变量之外,MAX类型也可以用于定义表的字段:

CREATE TABLE BigStrings

(

BigString VARCHAR(MAX)

)

当用于表的时候,意识到MAX类型具有与TEXT和IMAGE类型稍微不同的行溢出行为是非常重要的。在SQL Server中,最大的行尺寸是8060字节。要超过这个限制,

并且仍然管理每个都拥有高达2GB的存储,用TEXT和IMAGE类型存储的数据会被存储引擎自动地断行,在行里只留下一个16字节的指针。这意味着行的尺寸是减少了,这对性能有好处。然而,检索大数据是昂贵的,

因为它不是与同一行的数据存放在同一个位置。

MAX数据类型在默认情况下,使用TEXT/IMAGE溢出行为和正常尺寸的VARCHAR/VARBINARY类型的行为的混合方式。如果一个字段的数据,加上表中所有其他字段的数据,总量少于8060字节,

数据就存放在行内。如果数据超过8060字节,MAX字段的数据就会存放在行外。对于大字符串的表,以下的行将会与表中的其他数据存储在同一个数据页内:

INSERT BigStrings (BigString)

VALUES (REPLICATE('1', 8000))

But the following row will result in an overflow:

INSERT BigStrings (BigString)

VALUES (REPLICATE(CONVERT(VARCHAR(MAX), '1'), 100000))

你可以更改MAX数据类型在每个表的基础上的默认的行为,它们会表现得和TEXT和IMAGE类型一样。这是通过使用sp_tableoption 存储过程中的“大数值类型在行外”选项实现的。

为了修改大字符串表以将MAX类型的处理方式变得与TEXT和IMAGE数据类型的处理方式相同,可以使用如下的T-SQL:

EXEC sp_tableoption

'BigStrings',

'large value types out of row',

'1'

看看定义一个MAX数据类型有多容易,与他们提供的灵活性一样,一些数据设计师将会被引诱以下列的方式开始定义表:

CREATE TABLE Addresses

(

Name VARCHAR(MAX),

AddressLine1 VARCHAR(MAX),

AddressLine2 VARCHAR(MAX),

City VARCHAR(MAX),

State VARCHAR(MAX),

PostalCode VARCHAR(MAX)

)

设计师要注意了:不要这样做!一个企业中的数据模型既应该包含有具有实际限制的数据,还要给用户接口设计师有关字段尺寸的大致的指导。像这样的表又该创建什么样的用户接口呢?

除了数据整合和用户接口含义之外,如果设计师这样不必要地使用这些类型还会带来性能上的损害。记住,查询优化器使用字段的尺寸作为判断优化查询计划的众多标准之一。对于这个表,优化器几乎没有任何选择。

所以,现在你知道了MAX数据类型为SQL Server 2005处理大数据增加了很大部分的灵活性。但是MegaWare的那个不幸的数据库管理员,

Steve会发生什么变化?还在坚持使用sql server 2000,他开始更新简历,想象着如果更新表失败了话,他的工作也就失去了。

但是他也是幸运的——还有世界各地的MegaWare产品的拥护者——用GOOGLE的搜索可以很快地找到这篇文章《在TEXT字段中查找并替代》 ,这篇文章告诉他如何正确的进行更新。

他花了整晚的时间来学习资料;再过几个月之后,TEXT和IMAGE数据类型就仅仅是一段不愉快的记忆了。

相关文章:
  • 7月10日基金净值:中邮新思路灵活配置混合最新净值2.475,跌0.08%
  • 6月28日基金净值:交银瑞和三年持有期混合最新净值0.8874,跌0.1%
  • 5月19日基金净值:易方达远见成长混合A最新净值1.0932,涨0.47%
  • 浦银安盛中证证券公司30ETF净值下跌1.54% 请保持关注
  • 4月20日基金净值:安信新趋势混合A最新净值1.184
  • 4月28日基金净值:建信中证1000指数增强A最新净值1.6995,涨0.72%
  • 6月28日基金净值:富国转型机遇混合最新净值1.8445,涨0.41%
  • 7月11日基金净值:广发多因子混合最新净值3.3426,涨0.24%
  • 4月26日基金净值:博时价值增长混合最新净值1.009,跌0.59%
  • 4月19日基金净值:富国积极成长一年定开混合最新净值1.256,跌0.14%