从此Microsoft 文档中,+
n 定义字符串长度,可以是 1 到 8,000 之间的值。max 表示最大存储大小为 2^31-1 字节(2 GB)。存储大小是输入数据的实际长度 + 2 个字节。
请帮助我理解这一点。
varchar 的最大字符数似乎是8000
,这远低于2GB
数据的价值。
我看到varchar(max)
特定表的此列中有len(mycolumn)
> 100 000 的记录。因此我知道我可以将更多的8000
字符放入varchar(max)
列中。
问题 1:角色是如何8000
发挥作用的,我应该在哪里注意?
问题 2:.net datareader 查询此列是否总是返回包含 100 000+ 个字符的完整结果?
我明白你为什么会误解这一点——这有点棘手。这些都是有效的:
是的,如果您尝试从 VARCHAR(MAX) 字段中获取数据,并且有人在其中存储了 2GB,请系好安全带。
将 n 设置为 8000 会导致 8000 个字符发挥作用。您需要了解有关 char、nchar、nvarchar 和 varchar的Precision、Scale 和 Length (Transact-SQL)引用。相反,将 n 设置为 max (无引号)会导致 SQL Server 存储(并返回)最大字节数(如您的报价中所述)。
这是一个 .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 字符(因此我们的很大一部分全球用户将无法在您的应用中看到他们的本地化/本地字符)。