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

Pet*_*ock 13 sql-server varchar max

这个微软文档,+

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 datareader 查询此列是否总是返回包含 100 000+ 个字符的完整结果?

Bre*_*zar 30

我能理解你为什么会误解这一点——这有点棘手。这些都是有效的:

  • VARCHAR(1) - 一个字符串
  • VARCHAR(4000) - 4,000 个字符
  • VARCHAR(8000) - 8,000 个字符 - 如果您为此字段的定义使用数字,这是您可以使用的最高数字,但请注意:
  • VARCHAR(MAX) - 最多可容纳 2GB。

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

  • `有人在那里存储了 2GB,系好安全带。` - 有几个 blob 文件 (3认同)

Bil*_*ill 7

问题1:8000个字符是如何发挥作用的,我应该在哪里知道它?

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

问题 2: .net datareader 查询此列是否总是返回包含 100 000+ 个字符的完整结果?

这是一个 .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 字符(因此我们的很大一部分世界上的用户将无法在您的应用中看到他们的本地化/本机字符)。