3

我做了红色阅读本,无法清楚地了解...为什么在varchar(n)中将n指定为具体数字?

有(缩短这个问题的目的)

DECLARE @temp VARCHAR(4001); 
--update: 4001 is for example only to avoid varchar(MAX) discussions 
-- I am aware about 8000 
SET @temp = 'a'; 

做的SQL Server 4001个的储备字节@temp其中(从@temp的4001个字节剩余的4000个)在@temp处置之前不能被重复用于任何其他目的?

如果它不那么 (更新:对不起,这是修辞的问题,我认为这并没有改变我的问题的意义上):

  • 为什么SQL服务器需要知道的最大尺寸varchar值?
  • 为什么不能将大于4001字节的字符串重新分配给@temp?
    更新:如果4001字节未预先分配或为@temp保留
  • SQL Server如何使用此大小?

关于包含一个varchar(4001)列的表的相同问题。
我应该如何在varchar(4001)中命名4001以避免varchar(max)带来的歧义?
即避免接触“最大”字。

[1],例如,暗示它是柱尺寸:

VARCHAR数据类型为可变长度的数据类型。值比尺寸列短... [1]

可能理解这个大小被保留,列具有固定大小(所有行),独立地更短的值存储在那里。
正确吗?如果不正确, 使用[1]中的术语,varchar(4001)列的大小是多少?

更新
我想(通过指定4001),以避免从行值存储偏离这个主题(来,为前,SQL Server的VARCHAR(最大值),文本等类型),以及以其他主题在这里没有具体问到。

这些问题不是关于如何在varchar(n)中使用n,而是如何使用它(由SQL Server)。

我欢迎其他DBMS的专家,因为它应该是DBМS无关的问题,但具体数字是在SQL Server 2000的范围内指定的(或不2005+ VARCHAR(MAX))

UPDATE2
的根据[2],用于在SQL Server中存储表数据的长度前缀大小始终为2。 为什么不只是使用varchar()让SQL Server以实际大小工作呢?
除了我(故意)基于我的问题变量。
此外,把数字确实截断存储/数据:

DECLARE @temp VARCHAR(2); 
SET @temp = 'aaaaaa'; 
select @temp 
-- result is: aa 

[1]
MSDN “使用char和varchar数据”
http://msdn.microsoft.com/en-us/library/ms175055.aspx
[2]
估计堆
的大小 http://msdn.microsoft.com/en-us/library/ms189124.aspx

回答

2

如何在varchar(n)中使用n?

它依赖于实现。

SQLite,n被完全忽略。

PostgreSQL,varchar(n)基本上等于TEXT约束CHECK (LENGTH(TheColumn) <= n)。指定最大大小没有性能优势。

MySQLn确定长度前缀的大小,因此VARCHAR(255)使用1个字节来存储长度,和VARCHAR(65535)使用2个字节。

对于MS SQL Server中,看到问题[Why not use] varchar(max) everywhere?

+0

不幸的是,“[为什么不使用] varchar(max)无处不在?”问题没有任何明确的答案,只是一堆猜测。有没有人对SQL Server有明确的答案? – Gabe 2010-10-16 18:00:36

1

为什么一个分配TINYINT或整数?如果你的数据为一个给定的列有15个离散值,那么tinyint显然。

同样适用于varchar:它告诉SQL Server在此列中预期值/长度。 SQL Server抛出数据将被截断的错误。

您可以对NULL/NOT NULL,或外键或CHECK约束等应用相同的参数:它们都是为了保持数据正确。参见“Declarative referential integrity”。

例如,我想禁止有人尝试在我的100字节名称纯文本列中存储500k的XMl,因为他们可以。如果有人确实成功了,那么其他客户端最多需要100个字节会发生什么?

这对于存储效率也很重要。为c#对象声明“String”是可以的,您可以实例化,使用,放弃并保留在内存中(主要是),因为它的寿命很短。持续10亿行“字符串”是不必要的开销。

有人可能会走得更远,问为什么使用varchar? Why not use nvarchar everywhere?同样,我确实有存储货币代码近10亿行的表格。与char(3)相比,nchar(3)需要额外的3GB存储空间(+索引+行长度变化)。简介:这是对你的数据的一个限制。

+0

将'VARCHAR(n)'作为长度限制的想法是合理的(虽然我个人讨厌最大宽度字段),但我不明白为什么它对存储效率有利。 “VARCHAR”的全部不是它的存储大小是由实际数据的大小而不是声明决定的吗? – dan04 2010-10-17 16:51:58

+0

@ dan04:我假定了一个问题的一个方面:“为什么我不能有一个类似.net的字符串,而不用担心n”。超过十亿行,这给了你很大的不确定性,因为你将如何在每行存储高达2GB *而没有任何长度限制 – gbn 2010-10-17 17:07:17

相关问题