繁体   English   中英

什么时候是nvarchar(Max)= nvarchar(4000)?

[英]When is nvarchar(Max) = nvarchar(4000)?

SO和其他站点上有多个帖子,清楚地表明nvarchar(max)的最大长度为2GB。 但是,我在互联网和现实生活中也看到很多混乱,它实际上是Unicode中的8000/4000。

我想知道什么事情可以改变这个事实,或者可能导致某人错误地假设。

我已经收集了一些建议/部分答案:

  1. 是否有较旧的SQL Server版本,最多只支持4000?
  2. 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 
  3. 有没有办法禁用该功能? sp_tableoption @OptionName=large value types out of rowOBJECTPROPERTY(id,'TableTextInRowLimit')是否与此有关?

    澄清 :我的目标不是使用此功能,而是要注意它的存在,这可能确实已被更高权限的用户使用,这将阻止使用最大大小。

  4. 其他任何一点都欢迎

这里有几点,因为我不能适应评论。

  1. 是。 (n)varchar(MAX)在SQL Server 2005中引入的 以前你必须使用varchar(MAX)nvarchar(MAX)varbinary(MAX)textntextimage 旧数据类型已被弃用了很长时间,您不应该使用它们。
  2. 组合数据时,使用数据类型优先级来计算最终数据类型。 当涉及长度时,使用长度的组合值(连接的varchar(10)varchar(100)将返回varchar(110) 。但是,请注意,为了实现MAX长度的使用,至少一个字符串必须是(n)varchar(MAX) SELECT REPLICATE(N'A',3000) + REPLICATE(N'A',3000) AS S将返回4000个字符串。 +(String Concatenation)(Transact- SQL) - 备注

    如果字符串串联的结果超过8,000字节的限制,则结果将被截断。 但是,如果连接的至少一个字符串是大值类型,则不会发生截断。

  3. 禁用什么功能? (n)varchar(MAX)的用法? 为什么? 如果您想阻止使用数据类型的人使用(n)textimage停止它们。 但是,严肃地说,您无法停止使用数据类型。 也许你可以用DDL触发器“聪明”,但我建议反对它。

    要回答编辑, sp_tableoption不能用于阻止某人使用MAX length数据类型no; 我的上述观点。 引用文档( sp_tableoption(Transact-SQL) - 参数

    超行的大值类型:
    1 = varchar(max)nvarchar(max)varbinary(max)xml和表中的大型用户定义类型(UDT)列存储在行外,并带有指向根的16字节指针。

    0 = varchar(max)nvarchar(max)varbinary(max)xml和大UDT值直接存储在数据行中, varbinary(max)限制为8000字节,只要该值可以适合记录。 如果该值不适合记录,则指针存储在行中,其余指针存储在LOB存储空间中的行之外。 0是默认值。

    大型用户定义类型(UDT)适用于:SQL Server 2008到SQL Server 2017。

    使用CREATE TABLETEXTIMAGE_ON选项指定存储大型数据类型的位置。

  4. SO太宽泛了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM