【发布时间】:2019-03-29 10:16:31
【问题描述】:
在 SO 和其他网站上有多个帖子明确指出 nvarchar(max) 的最大长度为 2GB。但是,我在互联网和现实生活中也看到很多混淆,它实际上是 Unicode 中的 8000/4000。
我想知道什么事情可以改变这个事实,或者可能导致某人错误地假设。
我已经收集到的一些建议/部分答案:
- 是否存在仅支持最多 4000 个的旧 SQL Server 版本?
-
将
nvarchar(max)变量/列分配给非最大尺寸组件的串联时,我们必须将所有内容显式转换为nvarchar(max)吗?这里展示了一个奇怪的例子,其中文本返回函数需要转换,而文字的 N 可以省略:declare @s nvarchar(max) select @s = convert(nvarchar(max), replicate('.', 8000)) + N'Hi!' select len(@s) -- returns 8003 declare @s nvarchar(max) select @s = replicate('.', 8000) + N'Hi!' select len(@s) -- returns 4000 declare @s nvarchar(max) select @s = convert(nvarchar(max), replicate('.', 8000)) + 'Hi!' select len(@s) -- returns 8003 -
有没有办法禁用该功能?
sp_tableoption @OptionName=large value types out of row或OBJECTPROPERTY(id,'TableTextInRowLimit')与此有关吗?澄清:我的目的不是使用此功能,而是注意它的存在,它可能确实已被更高权限的用户使用,这将阻止 me 从使用最大尺寸。
欢迎任何其他观点
【问题讨论】:
-
而且从来没有出现过
nvarchar(max)为 4000 的情况。以前的情况是 max 关键字在此上下文中不存在,而您的最大数量可以指定为 4000 但这并不完全相同。此外,如果您受到此影响,您将遇到更大的问题,因为没有max支持的上一个版本是SQL Server 2000,它long 不再支持。 -
还有很多关于字符串连接的问题,最终会回到this documentation:“如果字符串连接的结果超过了8000字节的限制,结果会被截断。但是,如果连接的字符串中至少有一个是大值类型,不会发生截断。"
-
@Damien_The_Unbeliever 1. 哇,甚至超过 2GB?有趣的。不过我对 2GB 没问题,所以我不会在 atm 上搜索太多。 2. v2000 是第一个支持(或最后一个不支持?)nax 支持的花絮对我来说很重要,也许是一个答案?因为我在 MS 文档上找不到该链接,所以我永远无法确定。
-
@GeorgeMenoutis 您应该阅读文档,而不是可能不提及您的问题的零散答案。没有混乱。文档对所有这些都非常清楚。 BLOB/CLOB 类型中从来没有任何 4K 字符限制。
text/ntext/image基本上永远被弃用了。很少提及古代类型,因为它们永远不应该被使用。这些参考资料表明它们不应该被使用。
标签: sql-server tsql nvarchar