varchar(5)和varchar(5000)有什么区别?

17

可能是重复问题:
varchar(500)与varchar(8000)相比有什么优势吗?

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

存储大小是输入数据的实际字节长度,而不是n个字节。

通常,在规划数据库结构时,我尝试想象要存储在这些 varchar 字段中的最大字符串长度,然后设置该想象大小+一些备份用于 varchar 字段。有时可能会发生最初提供的空间不足以容纳字段的情况,那么我需要增加长度。

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

更新

这是我的意思(优点):https://dev59.com/-FXTa4cB1Zd3GeqP0lnT#5353196

是的,查询优化器可以猜测一页中适合的行数,如果您有很多超过必要大小的 varchar 字段,则 SQL Server 可能会在内部猜测错误的行数。

上述内容是否正确?还有其他优点吗?


回复:您的编辑。请参见此处我的答案 - Martin Smith
2个回答

20

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

对于我来说,这就已经足以成为不使用varchar(5000)(或varchar(max))的一个致命标准,即使没有必要也是如此...

请使用适当的大小。

此外:varchar至少会增加2个字节的开销,因此对于长度小于等于10个字符的字符串,我总是建议改用char(n)

char(5)将始终使用5个字节的存储空间。varchar(5)的存储空间则在2到7个字节之间变化。


3
所以实际上,varchar(15)varchar(500) 在效率和速度方面是相同的,对吗?也就是说,如果我认为数据大约在15-20字节左右(可能更少或稍微长一些),我可以只指定为varchar(150)?这实际上是我的主要问题。 - net_prog
我不理解那个“总是”...问题在于使用varchar(500)或varchar(max),排除了任何字符串通常会少于10个字符的建议。 - Isaac Llopis
1
一个类型为 char(100) 的列将始终恰好有100个字符的长度 - 即使您只在其中存储了 Isaac,它也会用空格填充到定义的长度(100个字符) - 所以实际上您正在存储 Isaac.................... - 这是非常低效的。 - marc_s
1
列的填充取决于您是否设置了ANSI_PADDING ON/OFF。 - Frank

15

MS SQL Server会以不同的方式存储varchar(8000)和更短的变量类型与varchar(MAX)。

如果[大型值类型超出行]未开启,则将MAX类型从表数据页转移到自己的数据页的大小现在已固定为8,000字节。

使用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 Compact Edition不支持varchar(MAX)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接