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

发布于 2024-09-27 22:13:10 字数 1873 浏览 3 评论 0原文

我对此进行了红色阅读,但无法清楚地理解...

(为了缩短这个问题)

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?
    更新:如果 4001 字节没有预先分配或保留给 @temp
  • SQL Server 如何使用这个大小?

关于包含一个 varchar(4001) 列的表的相同问题。
我应该如何在 varchar(4001) 中命名 4001 以避免与 v​​archar(max) 产生歧义?
即避免使用“最大”一词。

例如[1],提示它是列大小:

varchar 数据类型是一种可变长度数据类型。值小于列的大小... [1]

可以理解该大小是保留的,列具有固定大小(在所有行上),独立于存储在那里的较短值。
<罢工>正确吗?如果不正确则 使用 [1] 中的术语,varchar(4001) 列的大小是多少?

更新
我希望(通过指定 4001)避免该主题偏离行内值存储(例如,SQL Server varchar(max)、文本等类型)以及此处未特别询问的其他主题。

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

我欢迎其他 DBMS 专家,因为它应该是与 DBМS 无关的问题,尽管具体数字是在 SQL Server 2000(或不带 varchar(MAX) 的 2005+)的上下文中指定的

更新 2
根据[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

I did red-read on this and could not clearly understand...

Having (for the purpose of shortening this question)

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

does SQL Server reserve 4001 bytes for @temp which (the rest 4000 from 4001 bytes of @temp) cannot be reused for ANY other purposes until @temp is disposed?

If it doesn't then (update: sorry, this was rhetoric question, I believe it did not change the sense of my questions) :

  • Why does SQL Server need to know maximum size of varchar values?
  • Why cannot the string of size bigger than 4001 bytes be (re)assigned to @temp?
    update: if 4001 bytes are not pre-allocated or reserved for @temp
  • How SQL Server uses this size?

The same questions about a table containing one varchar(4001) column.
How should I name 4001 in varchar(4001) in order to avoid ambiguity with varchar(max)?
i.e. avoiding engagement of "maximum" word.

[1], for example, hints that it is column size:

The varchar data type is a variable-length data type. Values shorter than the size of the column... [1]

that I could have understood that this size is reserved, the column has fixed size (over all rows), independently of shorter values stored there.
Correct? If not correct then
what is the size of a varchar(4001) column, using terminology from [1]?

Update
I wanted (by specifying 4001) to avoid deviating this topic from in-row value storage (to, for ex., SQL Server varchar(max), text, etc. types) as well to other topics not specifically asked here.

The questions are not about how to use n in varchar(n) but how it is used (by SQL Server).

I welcome other DBMS specialists, since it should be DBМS agnostic questions, though concrete digits are specified in context of SQL Server 2000 (or 2005+ without varchar(MAX))

Update2:
The size of length prefix for storing table data in SQL Server is always 2 according to [2].
Why not just to use varchar() to let SQL Server do it job with actual size?
Besides I (intentionally) based my question on variable.
Also, put digit really truncates the storage/data:

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

[1]
msdn "Using char and varchar Data"
http://msdn.microsoft.com/en-us/library/ms175055.aspx
[2]
Estimating the Size of a Heap
http://msdn.microsoft.com/en-us/library/ms189124.aspx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨小墨 2024-10-04 22:13:10

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

How is n in varchar(n) used?

It's implementation-dependent.

In SQLite, n is completely ignored.

In PostgreSQL, varchar(n) is essentially equivalent to TEXT with the constraintCHECK (LENGTH(TheColumn) <= n). There is no performance advantage to specifying a maximum size.

In MySQL, n determines the size of the length prefix, so VARCHAR(255) uses 1 byte to store the length, and VARCHAR(65535) uses 2 bytes.

For MS SQL Server, see the question [Why not use] varchar(max) everywhere?

默嘫て 2024-10-04 22:13:10

为什么要分配tinyint或integer?如果给定列的数据有 15 个离散值,那么显然是tinyint。

这同样适用于 varchar:它告诉 SQL Server 此列中需要什么值/长度。如果数据被截断,SQL Server 会抛出错误。

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

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

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

有人可能会更进一步问为什么要使用 varchar? 为什么不在各处使用 nvarchar? 同样,我确实有存储货币代码的表行数接近十亿。 nchar(3) 与 char(3) 花费了我额外的 3GB 存储空间(+索引+行长度变化)。

摘要:这是对您的数据的限制。

Why would one assign tinyint or integer? If your data for one given column has 15 discrete values then tinyint obviously.

The same applies to varchar: it tells SQL Server what values/lengths are expected in this column. SQL Server throws an error it the data would be truncated.

You could apply the same argument for NULL/NOT NULL, or foreign keys or CHECK constraints etc: they are all there to keep your data correct. See "Declarative referential integrity".

For example, I'd want to disallow someone trying to store 500k of XMl in my 100 byte name plain text column because they can. If someone did succeeds, what do think will happen to other clients that expected 100 bytes maximum?

It's also important for storage efficiency. It's Ok to declare "String" for a c# object that you may instantiate, use, discard and stays in memory (mostly) for it's short life. Persisting a billion rows of "string" is an unnecessary overhead.

One may go further and ask why use varchar? Why not use nvarchar everywhere? Again, I do have table that store currency code with approaching a billion rows. nchar(3) vs char(3) costs me an extra 3GB of storage (+ indexes + row length changes).

Summary: it's a constraint on your data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文