2012-01-27 522 views
12

可能重复:
is there an advantage to varchar(500) over varchar(8000)?varchar(5)和varchar(5000)之间的区别?

在SQL Server中,我们可以指定字段类型varchar(n)

存储大小为实际长度中输入的数据字节,不是 字节。

通常规划数据库结构,当我试着想象的字符串将被存储在这些领域varchar的最大可能的长度,然后设置想象大小+一些备份的varchar领域。有时候可能会出现这样的情况:最初提供的房间不足以满足现场需要,然后我需要增加长度。

但实际上,是否值得将varchar字段限制为某个值,而不是仅仅设置类似varchar(5000)甚至varchar(max)这将100%适合这种情况?当我限制长度为n时,在SQL Server或索引组织中的页组织中是否有任何优势?

更新

这里是我的意思(优势):https://stackoverflow.com/a/5353196/355264

是,查询优化器可以猜出多少行适合在一个页面上,如果你 有很多大于必需的varchar字段,SQL 服务器可以在内部猜测错误的行数。

以上是真的吗?还有其他优点吗?

+1

[varchar(500)over varchar(8000)是否有优势?](http://stackoverflow.com/questions/2009694/is-there-an-advantage-to -varchar500-over-varchar8000)或[varchar(ma x)到处?](http://stackoverflow.com/questions/2091284/varcharmax-everywhere)或[SQL Server VARCHAR列宽](http://dba.stackexchange.com/questions/11614/sql-server- varchar-column-width) – 2012-01-27 12:24:20

+0

RE:你的编辑。看到[我的答案在这里](http://stackoverflow.com/questions/2009694/is-there-an-advantage-to-varchar500-over-varchar8000/5654947#5654947) – 2012-01-27 12:46:29

回答

17

首先 - 你不能索引超过900字节大小的任何列。

这本身(对我来说)是反对使用varchar(5000)(或varchar(max))所有的时间杀手的标准,即使不需要....

使用适当的大小。

另外:varchar会增加至少2个字节的开销,所以对于10个字符或更少的字符串,我总是建议使用char(n)来代替。

char(5)将使用5个字节的存储 - 总是。 varchar(5)使用2到7个字节的存储空间。

+2

所以实际上'varchar(15)'将是在效率和速度方面与'varchar(500)'相同,对吗?即如果我认为数据将在15-20字节左右(可能更少或更长一点),我可以指定'varchar(150)'?这实际上是我的主要问题。 – 2012-01-27 12:24:44

+0

我不明白,“总是”...使用varchar(500)或varchar(max)之间的问题排除任何暗示字符串通常不超过10个字符的建议。 – 2014-03-18 09:51:04

+1

'char(100)'类型的列将总是**正好100个字符 - 即使您只存储了“Isaac”,它也会被填充到指定长度(100个字符),并带有空格 - 所以你真的存储'Isaac ....................' - 这是非常低效的 – 2014-03-18 09:52:28

12

MS SQL Server存储varchar(8000),与varchar(MAX)不同。

在这MAX类型移出表的数据页和 到它自己的数据页的大小现在固定为8000个字节,如果[大值 类型在行外]设置为OFF。

有几个原因,为什么你会使用使用VARCHAR(n)的,而不是VARCHAR(MAX)

性能

VARCHAR(n)的更快 http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/

索引

VARCHAR(900)和更小的可以被索引,而不是VARCHAR(MAX)或varchar(901)或更大的

兼容性

MS SQL Server精简版不支持varchar(MAX)