国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页数据库类SQL Server → SQL Server 2005:数据类型最大值

SQL Server 2005:数据类型最大值

我要评论 2009/06/07 11:50:25 来源:国语自产精品视频在线看 编辑:佚名 [ ] 评论:0 点击:488次

事情开💻始得很【shǐ dé hěn】简单。MegaWare公司市场部门【chǎng bù mén】想要一个新的【gè xīn de】网站来发布文档,开发团队觉得使用SQL Server 2000数据库作为文档存储😑仓库会【cāng kù huì】📒使事情🐋变得简单。Steve是MegaWare的数据【de shù jù】库管理【kù guǎn lǐ】😾员【yuán】😨,没有看出这有什么大问题【wèn tí】😽;在数据库中存【kù zhōng cún】👪储文档【chǔ wén dàng】🛂,而不是使用文🌊件系统【jiàn xì tǒng】,意味着服务器需要多【duō】做一些🧑工作🚄,但是它😵也会使得备份【dé bèi fèn】👹和管理【hé guǎn lǐ】容易得🎄多【duō】。数据库与文件【yǔ wén jiàn】系统变❌得不同【dé bú tóng】步也应该是不可能的。

市场部【shì chǎng bù】📍门想要【mén xiǎng yào】存储的【cún chǔ de】许多文档都超✒过了【guò le】8000个字节,那么很明显🔆VARCHAR不是适合这项🔪工作的【gōng zuò de】♌数据类型【xíng】⏫。作为替代,TEXT数据类型【xíng】⏫被用来定义存【dìng yì cún】放数🦈据的字段【duàn】⚫。因为每【yīn wéi měi】个TEXT都能容【dōu néng róng】纳2GB的内容,TEXT要存放🅿市场部【shì chǎng bù】📍门的同【mén de tóng】事们扔😈进数据库的最🏍大的文件也是没有问🔨题的。

数月过去了⏲,市场用大量的🌄无聊拷🆒贝填满【bèi tián mǎn】了整个🙏数据库📬。但是这还不是Steve真正关【zhēn zhèng guān】心的问题。数据库📬愉快地【yú kuài dì】嗡嗡作响地运【xiǎng dì yùn】🔑转着【zhuǎn zhe】,每个人对项目【duì xiàng mù】的结果🕓都很满意【yì】。

直到公【zhí dào gōng】司的标🚣语改变🙋的那个【de nà gè】🔧重大的日子【rì zǐ】。市场部【chǎng bù】🏮的团队认为【rèn wéi】💸“MegaWare: It's really cool!”要比原【yào bǐ yuán】来的“It's MegaWare's Way or the Highway!” 听起来更好【gèng hǎo】。因为市场部【chǎng bù】🏮团队已经😑将原来【jiāng yuán lái】的标语【de biāo yǔ】嵌入了仓库中每个文档的页脚上【jiǎo shàng】🖨,现在💀Steve的工作就是更改所有这些文档的页脚🌀。

“没有问题,” Steve想🦖,打开【dǎ kāi】SQL Server 查询分🕋析器工具【jù】,执行了如下的T-SQL批处理【pī chù lǐ】🍻:

UPDATE MarketingDocuments

SET Document =

REPLACE(Document,

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

'MegaWare: It''s really cool!)

当他看🚳到出现【dào chū xiàn】🤰的错误🚘消息的【xiāo xī de】🐻时候,Steve的轻松的微笑很快消【hěn kuài xiāo】失了,“替换函【tì huàn hán】数【shù】的参🥥数【shù】1,text数【shù】据类型无效。”

替换函🤣数在编写出来【xiě chū lái】的时候【de shí hòu】🏧,就对TEXT数据类型不起作👽用。同样也对CHARINDEX或者【huò zhě】📥SUBSTRING不起作👽用——或者【huò zhě】至💺少是他【shǎo shì tā】们在超【men zài chāo】过8千个字🔆符的情况下不🎢起作用【qǐ zuò yòng】🆘。更进一【gèng jìn yī】步地讲,开发人员忘了处理🎯TEXT或者【huò zhě】📥IMAGE类型的【lèi xíng de】🍒本地变【běn dì biàn】量;实际上👷不支持【bú zhī chí】📴任何操🔸作。即使是😒简单地更新一个文档中的一【zhōng de yī】个子字符串都【fú chuàn dōu】需要用【xū yào yòng】到晦涩【dào huì sè】的东西,以及难🛳以使用的类似READTEXT和【hé】WRITETEXT的函数👿。而不是开发人员或者【huò zhě】🏈忙碌的数据库【shù jù kù】管理员因为想【yīn wéi xiǎng】要弄清如何正😤确使用而采用【ér cǎi yòng】了不同【le bú tóng】🃏类型的【lèi xíng de】🍒函数消耗了时【hào le shí】间💮。

SQL Server的开发【de kāi fā】💱人员很幸运【xìng yùn】,他们将会拨开💥乌云见📅蓝天【lán tiān】。SQL Server 2005引入了【yǐn rù le】一系列新的被称为MAX的数据🐚类型【lèi xíng】🚔。这是VARCHAR,NVARCHAR和【hé】VARBINARY类型【lèi xíng】🚔的扩展【de kuò zhǎn】,这几种类型【lèi xíng】以🌅前被限【qián bèi xiàn】💳制在8000字节以⛏下。MAX可以容【kě yǐ róng】🚸纳高达2GB的数据🐚,与TEXT和【hé】IMAGE一样🤚——并且完全兼容【quán jiān róng】所有的【suǒ yǒu de】SQL Server内置的字符串🧜函数。

用【yòng】MAX关键字【guān jiàn zì】定义一个某种🙋MAX类型的变量与替代字【tì dài zì】符串的【fú chuàn de】⌛尺寸🦊(为🗾VARCHAR/NVARCHAR的时候)或者字【huò zhě zì】节🦊(为🗾VARBINARY的时候)一样简【yī yàng jiǎn】📖单。

DECLARE @BigString VARCHAR(MAX)

SET @BigString = 'abc'

虽然这【suī rán zhè】🦗个变量【gè biàn liàng】可以自由地操👊纵【zòng】,并且可🐉以传递给任何的内置的字符串函数【chuàn hán shù】🌁,兼容性仍然不📁是没有问题📔。首先【shǒu xiān】,开发人员不能期望指定了尺寸的VARCHAR和【hé】🏤VARBINARY变量在【biàn liàng zài】🐘达到🐢8000个字节的极限🍲的时候🤣可以自动【dòng】“升级【shēng jí】”到MAX版本。例如【lì rú】,如下的【rú xià de】批处理:

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,但是指定了尺【dìng le chǐ】📣寸的VARCHAR的极限【de jí xiàn】是8000。因为这😌两个变量🚷中没有一个是【yī gè shì】MAX类型【lèi xíng】🏤,LEN函数的【hán shù de】结果就【jié guǒ jiù】是8000,不是【bú shì】8002。在将两【zài jiāng liǎng】个变量🚷连接的时候【de shí hòu】💝,一种简单的修【dān de xiū】正方法【zhèng fāng fǎ】就是声⛔明这两🛩个变量🚷中的一个为👕VARCHAR(MAX)或者将其中的🐨一个变【yī gè biàn】量🚷进行转换。与一个规定了尺【dìng le chǐ】📣寸的类【cùn de lèi】型进👙行连接的时候【de shí hòu】💝,优先考虑🕝MAX类型【lèi xíng】🏤,最终结🌘果是💌MAX类型【lèi xíng】🏤。所以,以下批🐑处理的结果是【jié guǒ shì】💌8002,正如我【zhèng rú wǒ】💛们期望【men qī wàng】的一样:

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)

在传递🌎给字符【gěi zì fú】😫串函数【chuàn hán shù】🚒的时候🆙,开发人【kāi fā rén】员意识【yuán yì shí】🎏到字符【dào zì fú】串的⏪原意在【yuán yì zài】默认情况下是【kuàng xià shì】规定了尺寸的⏪,而不是MAX类型🀄,也是至🛰关重要的⏪。例如【lì rú】,以下查询的⏪结果就很令人惊奇:

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

因为字【yīn wéi zì】符串【fú chuàn】🐧‘1’是被作【shì bèi zuò】🍞为规定🐙了尺寸的VARCHAR对待,而不是【shì】VARCHAR(MAX),结果就是【shì】8000——但是【shì】在SQL Server 2005中🌌,REPLICATE函数能🚂够产生【gòu chǎn shēng】高达⛲2GB的字符【de zì fú】串🐧。要修正这个问题👻,可以将字符串【zì fú chuàn】🐧转换为🍴VARCHAR(MAX),这样函数就会【shù jiù huì】🈲输出同样的类【yàng de lèi】型了:

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

这个查询现在将会返回期望【huí qī wàng】🈺的结果【de jié guǒ】:8002。记住【jì zhù】,总是要对采用【duì cǎi yòng】了新特🖋性编写的代码进行非常仔细【cháng zǎi xì】🍐的测试;隐藏的【yǐn cáng de】问题🍾,例如上面描述【miàn miáo shù】💪的问题【de wèn tí】🍾,可能并且毫无疑问地会在最坏的时🍍间里造🌫成灾难🔒性的后【xìng de hòu】果。

除了变🏭量之外【liàng zhī wài】,MAX类型也【lèi xíng yě】可以用🗨于定义表的字⬛段【duàn】:

CREATE TABLE BigStrings

(

BigString VARCHAR(MAX)

)

当用【yòng】于表的时候👷,意识到MAX类型具有与🍷TEXT和【hé】👠IMAGE类型稍🥖微不同的行溢【de háng yì】🤪出行为是【shì】非常重要的【chóng yào de】。在SQL Server中【zhōng】🐾,最大的行尺寸【háng chǐ cùn】是【shì】8060字节🛍。要超过🌏这个限🚫制【zhì】,并且仍【bìng qiě réng】然管理每个都拥有高达2GB的存储,用【yòng】TEXT和【hé】👠IMAGE类型存♊储的数【chǔ de shù】据【jù】🥅会被存储引🎗擎自动地断行【dì duàn háng】🐠,在行里🔠只留下😘一个16字节🛍的指针。这意味着行的尺寸是【shì】减少了,这对性能有好处【chù】。然而【rán ér】,检索大【jiǎn suǒ dà】数据【jù】是【shì】昂贵的【áng guì de】,因为它🐡不是与【bú shì yǔ】同一行的数据【jù】🥅存放在【cún fàng zài】🔡同一个👇位置。

MAX数据【shù jù】类型在默认情况下【xià】,使用💟TEXT/IMAGE溢出行为和正常尺寸🍚的【de】🤥VARCHAR/VARBINARY类型的【lèi xíng de】🤥行为的【de】🤥混合方式【shì】。如果一🍆个字段🎫的【de】数据【shù jù】👥,加上表中所有其他字段的【zì duàn de】👾数据【shù jù】,总量少于🦒8060字节,数据就【shù jù jiù】🚽存放在行内😰。如果数【rú guǒ shù】🚁据超过【jù chāo guò】💠8060字节,MAX字段的【zì duàn de】👾数据就【shù jù jiù】🚽会存放在行外【zài háng wài】。对于🦒大字符【dà zì fú】串的【de】🤥表,以下的【yǐ xià de】🤥行将会【háng jiāng huì】与表中的【de】🤥其他数【qí tā shù】据存储在同一【zài tóng yī】个数据【shù jù】页内🖌:

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))

你可以更改【gèng gǎi】⏸MAX数据类【shù jù lèi】型在每🔪个表的【de】✨基础上的默认【de mò rèn】的【de】行为,它们会【tā men huì】👞表现得和📙TEXT和📙IMAGE类型一【lèi xíng yī】样。这是通【zhè shì tōng】过使用sp_tableoption 存储过【cún chǔ guò】📹程中的【de】🐺“大数值【dà shù zhí】类型在行外🎉”选项实现的【de】🛡。为了修🔗改大字【gǎi dà zì】符串表以将【yǐ jiāng】MAX类型的【de】🙍处理方🕷式变得与TEXT和📙IMAGE数据类【shù jù lèi】型的【de】🙍处理方🕷式相同【shì xiàng tóng】,可以使用如下的【de】T-SQL:

EXEC sp_tableoption

'BigStrings',

'large value types out of row',

'1'

看看定义一个【yì yī gè】🦒MAX数据类【shù jù lèi】型有多【xíng yǒu duō】👅容易🎓,与他们提供的🛠灵活性一样【yī yàng】,一些数据设计【jù shè jì】师将会🌠被引诱以下列的方式🧒开始定义表【yì biǎo】:

CREATE TABLE Addresses

(

Name VARCHAR(MAX),

AddressLine1 VARCHAR(MAX),

AddressLine2 VARCHAR(MAX),

City VARCHAR(MAX),

State VARCHAR(MAX),

PostalCode VARCHAR(MAX)

)

设计师【shè jì shī】要注意🔐了:不要这样做【yàng zuò】!一个企【yī gè qǐ】🗣业中的数据模【shù jù mó】型既应该包含🤘有具有实际限制的数⤵据【jù】,还要给用户接口设计师【shè jì shī】有关🧓字段尺寸的大致的指【zhì de zhǐ】🎻导🤴。像这样【xiàng zhè yàng】的表又【de biǎo yòu】该创建🧤什么样【shí me yàng】的用户🕔接口呢?

除了数👽据整合和用户接口含义之外【yì zhī wài】,如果设🥛计师这样不必要地使🍉用这些类型还【lèi xíng hái】🆗会带来性能上【xìng néng shàng】的损害【de sǔn hài】🧟。记住,查询优【chá xún yōu】🔞化器使用字段【yòng zì duàn】⛱的尺寸作为判【zuò wéi pàn】🏿断优化【duàn yōu huà】查询计划的众多标准👌之一。对于这个表,优化器几乎没【jǐ hū méi】📻有任何【yǒu rèn hé】选择。

所以【suǒ yǐ】,现在⏩你知道了MAX数据类【shù jù lèi】型为🐦SQL Server 2005处理大💢数据增⏮加了很大部分【dà bù fèn】的【de】💭灵活性。但是☕MegaWare的【de】💭那个不幸的【de】✴数据库管理员,Steve会发生什么变⛎化?还在⏩坚持使用【yòng】🐧SQL Server 2000,他开始⛷更新【xīn】简🚩历【lì】,想象着如果更新【xīn】🎥表失败了话,他的【de】💭工作也【gōng zuò yě】就🍐失去了。但是他【dàn shì tā】🌠也是幸👄运的【yùn de】💭——还有世界各地🎉的【de】💭MegaWare产品的【chǎn pǐn de】💭拥护者——用【yòng】GOOGLE的【de】💭搜索可以很快地找到这篇文【zhè piān wén】章《在⏩TEXT字段中【zì duàn zhōng】查找并【chá zhǎo bìng】替代【tì dài】》,这篇文【zhè piān wén】章告诉他如何正确的【de】💭进行更【jìn háng gèng】🚓新【xīn】🎥。他花了整晚的【zhěng wǎn de】🎭时间来【shí jiān lái】学习资料【liào】;再过几⭕个月之🕊后,TEXT和IMAGE数据类【shù jù lèi】型就仅仅是一【jǐn shì yī】段不愉【duàn bú yú】快的【de】💭记忆了【jì yì le】📙。

关键词:SQL,Server,2005,数据类🛄型【xíng】

阅读本文后您有什么感想? 已有 人给出评价!

  • 0 欢迎喜欢
  • 0 白痴
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙视