为什么在varchar(n)中的n需要指定为具体数字?

3

我进行了阅读,但并没有完全理解...

为了简化这个问题,我想要...

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是否为@temp保留了4001个字节,其中(从@temp的4001个字节中的其余4000个字节)在@temp被处理之前不能用于任何其他目的?
如果不是这样,那么:
- SQL Server为什么需要知道varchar值的最大大小? - 为什么不能将大小超过4001字节的字符串(重新)分配给@temp? - SQL Server如何使用这个大小?
在一个包含一个varchar(4001)列的表中,如何命名varchar(4001)以避免与varchar(max)引起歧义?例如,避免使用“maximum”词汇。
[1]表明它是列的大小: " varchar数据类型是可变长度数据类型。比列的大小短的值..."
那么一个varchar(4001)列的大小是多少,使用[1]中的术语来说是什么?
更新: 我想(通过指定4001)避免偏离本文所述的主题(例如SQL Server varchar(max)、text等类型)以及其他未在此处具体要求的主题。
这些问题并不是关于如何使用varchar(n),而是关于它如何被SQL Server使用。
欢迎其他DBMS专家,因为这应该是DBMS无关的问题,尽管在SQL Server 2000(或2005+没有varchar(MAX)时)的上下文中指定了具体数字。
更新2: 根据[2],存储表数据的长度前缀大小始终为2。为什么不只使用varchar()让SQL Server处理实际大小?此外,我(故意)基于变量提出我的问题。此外,实际上放入数字会截断存储/数据。
DECLARE @temp VARCHAR(2); 
SET @temp = 'aaaaaa';
select @temp
 -- result is: aa

[1]
msdn "使用 char 和 varchar 数据"
http://msdn.microsoft.com/zh-cn/library/ms175055.aspx
[2]
估算堆的大小
http://msdn.microsoft.com/zh-cn/library/ms189124.aspx

2个回答

2
在 varchar(n) 中的 n 是如何使用的?
这取决于具体实现。
在 SQLite 中,n 被完全忽略。
在 PostgreSQL 中,varchar(n) 与带有约束 CHECK (LENGTH(TheColumn) <= n) 的 TEXT 几乎相同。指定最大大小没有性能优势。
在 MySQL 中,n 确定长度前缀的大小,因此 VARCHAR(255) 使用1个字节来存储长度,而 VARCHAR(65535) 使用2个字节。
对于 MS SQL Server,请参阅问题 [为什么不在任何地方都使用] varchar(max)?

不幸的是,“[为什么不在任何地方都使用] varchar(max)”这个问题没有明确的答案,只有一堆猜测。有人对SQL Server有明确的答案吗? - Gabe

1

为什么要分配tinyint或integer?如果您的某个列的数据有15个离散值,那么显然应该使用tinyint。

对于varchar也是同样的道理:它告诉SQL Server这个列中期望的值/长度。如果数据会被截断,SQL Server会抛出错误。

您可以为NULL/NOT NULL、外键或CHECK约束等应用相同的论点:它们都存在以保持数据正确性。请参见“声明性引用完整性”。

例如,我想禁止有人尝试在我的100字节名称纯文本列中存储500k的XML,因为他们可以这样做。如果有人成功了,您认为其他预期最多100字节的客户端会发生什么情况?

这对于存储效率也很重要。为一个您可能实例化、使用、丢弃并在内存中(大多数情况下)短暂存在的c#对象声明“String”是可以的。持久化十亿行的“string”是不必要的开销。

或许你会问:为什么要使用varchar?为什么不在所有地方都使用nvarchar呢?同样地,我有一个存储接近十亿行货币代码的表。nchar(3)和char(3)相比使我多花费了额外的3GB存储空间(+索引+行长度变化)。

总结:这是对你的数据的限制。


VARCHAR(n)视为长度约束是有道理的(尽管我个人非常讨厌最大宽度字段),但我不明白它在存储效率方面有什么优势。 VARCHAR的整个意义不就是其存储大小由实际数据的大小而不是声明确定吗? - dan04
@dan04: 我已经假定了问题中的一个方面:“为什么我不能有像 .net 那样的字符串而不用担心 n”。在超过十亿行的情况下,考虑到您每行最多可以存储2GB 没有任何长度约束,这会产生很多不确定性。 - gbn

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