了解varchar(max)8000列以及为什么我可以在其中存储超过8000个字符


13

通过 Microsoft文档,+

n定义字符串长度,可以是1到8,000之间的值。max表示最大存储大小为2 ^ 31-1字节(2 GB)。存储大小是输入数据的实际长度+ 2个字节。

请帮助我理解这一点。

varchar的最大字符似乎是8000,这远远少于2GB数据的价值。

我看到varchar(max)特定表的此列中有len(mycolumn)> 100 000的记录。因此,我知道我可以8000varchar(max)列中获得比字符更多的记录。

问题1:8000角色是如何发挥作用的,我应该从哪里知道呢?

问题2:.net数据读取器对此列的查询是否总是返回包含100000+个字符的完整结果?


请注意,该varchar(max)名称曾经被调用过text,被视为其他数据类型。
李斯特先生,

也许读过这个?它 8K页面大小有关。太大而无法容纳在单个页面中的值(该限制实际上略大于8000)被保存到LOB_DATA页面(大对象)。
贾斯汀

Answers:


30

我明白了您为什么误解了这一点-这有点棘手。这些都是有效的:

  • VARCHAR(1)-一个字符串
  • VARCHAR(4000)-4,000个字符
  • VARCHAR(8000)-8,000个字符-如果您在该字段的定义中使用数字,则该数字是您可以使用的最大数字,但是请注意以下几点:
  • VARCHAR(MAX)-最多可容纳2GB。

是的,如果您尝试从VARCHAR(MAX)字段中获取数据,并且有人在其中存储了2GB,请系好安全带。


3
and somebody stored 2GB in there, buckle up.-那里有一些斑点文件
罗斯兰

7

问题1:8000个字符如何发挥作用,我应该从哪里知道呢?

将n设置为8000将使8000个字符起作用。您需要了解有关char,nchar,nvarchar和varchar 的Precision,Scale和Length(Transact-SQL)参考。相反,将n设置为max(不带引号)将导致SQL Server存储(并返回)最大字节数(如引号中所述)。

问题2:.net数据读取器对此列的查询是否总是返回包含100000+个字符的完整结果?

这是一个.Net(不是SQL Server)问题,但是.Net数据读取器获取字节流。字节不是字符,SQL Server返回字节(不是字符)。如果n设置为8000并且数据类型为nvarchar,则SQL Server返回最多8000个字节,.Net数据读取器可以将其解释为4000个Unicode字符。如果n设置为8000,并且数据类型为varchar,则SQL Server返回最多8000个字节,.Net数据读取器可以将其解释为最多8000个ANSI字符。如果将n设置为max并且数据类型为nvarchar,则SQL Server返回最多2 ^ 31-1个字节,.Net数据读取器最多可以将其解释为(2 ^ 31-1)/ 2个字符。如果n设置为max并且数据类型为varchar,则SQL Server返回最多2 ^ 31-1个字节,.Net数据读取器可以将其解释为最多2 ^ 31-1个ANSI字符。

如果您选择使用char或varchar(而不是nchar或nvarchar),因为它们可以存储更多的“字符”(更准确地说:字节),则需要注意很多Unicode字符没有等效的ANSI字符(因此,我们的很大一部分世界的用户将无法在您的应用中看到他们的本地化/本地字符)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.