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

问题描述 投票:3回答:1

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. 其他任何一点都欢迎
sql-server tsql nvarchar
1个回答
3
投票

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

  1. 是。 (n)varchar(MAX)introduced in SQL Server 2005。以前你必须使用textntextimagevarchar(MAX)nvarchar(MAX)varbinary(MAX)。旧数据类型已被弃用了很长时间,您不应该使用它们。
  2. 组合数据时,data type precedence用于计算最终数据类型。当涉及长度时,使用长度的组合值(连接的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) - Remarks: 如果字符串串联的结果超过8,000字节的限制,则结果将被截断。但是,如果连接的至少一个字符串是大值类型,则不会发生截断。
  3. 禁用什么功能? (n)varchar(MAX)的用法?为什么?如果你想阻止使用数据类型的人停止使用(n)textimage。但是,严肃地说,您无法停止使用数据类型。也许你可以用DDL触发器“聪明”,但我建议反对它。 要回答编辑,sp_tableoption不能用来阻止某人使用MAX长度数据类型no;我的上述观点。引用文献(sp_tableoption (Transact-SQL) - Arguments: 超行的大值类型: 1 =表中的varchar(max)nvarchar(max)varbinary(max)xml和大型用户定义类型(UDT)列存储在行外,并带有指向根的16字节指针。 0 = varchar(max)nvarchar(max)varbinary(max)xml和大型UDT值直接存储在数据行中,最大限度为8000字节,只要该值可以适合记录。如果该值不适合记录,则指针存储在行中,其余指针存储在LOB存储空间中的行之外。 0是默认值。 大型用户定义类型(UDT)适用于:SQL Server 2008到SQL Server 2017。 使用TEXTIMAGE_ONCREATE TABLE选项指定存储大型数据类型的位置。
  4. SO太宽泛了。
© www.soinside.com 2019 - 2024. All rights reserved.