在SO和其他站点上都有多个帖子,其中明确指出nvarchar(max)的最大长度为2GB。然而,我也看到,在互联网和现实生活中,它实际上是8000/4000的Unicode。
我想知道什么事情可以改变这一事实,或者可能导致一些人错误地假设这一点。
我已经收集到了一些建议/部分答案:
nvarchar(max)变量/列分配给非最大大小组件的级联时,必须显式地将所有内容转换为nvarchar(max)吗?这里展示了一个奇怪的示例,其中文本返回函数需要转换,而文字的N可以省略:
声明@s nvarchar(max)选择@s =转换(nvarchar(Max),复制(‘.’,8000)) +N‘’Hi!‘选择len( @s ) --返回8003 declare @s nvarchar(max) select @s=复制(‘.’,8000) +N‘’Hi!选择len( @s ) --返回4000 declare @s nvarchar(max) select @s= convert(nvarchar(max),复制(‘.’,8000)) + 'Hi!‘选择len(@s) --返回8003sp_tableoption @OptionName=large value types out of row或OBJECTPROPERTY(id,'TableTextInRowLimit')与此有任何关系吗?
Clarification:我的目标不是使用这个功能,而是要注意它的存在,它可能确实被一个更高权限的用户所使用,这将阻止我使用最大的大小。发布于 2019-03-29 10:27:59
这里有几点,因为我不能发表评论。
(n)varchar(MAX)为在Server 2005中引入。在此之前,您必须使用text、ntext和image来实现varchar(MAX)、nvarchar(MAX)和varbinary(MAX)。旧的数据类型已经被废弃很长时间了,您不应该使用它们。varchar(10)和varchar(100)连接将返回varchar(110)。但是,请注意,要实现MAX长度的使用,至少必须有一个字符串是(n)varchar(MAX)。SELECT REPLICATE(N'A',3000) + REPLICATE(N'A',3000) AS S将返回一个4000个字符串。+(字符串连接) (Transact-SQL) -备注:如果字符串连接的结果超过了8,000个字节的限制,则结果被截断。但是,如果连接的字符串中至少有一个是大值类型,则不会发生截断。(n)varchar(MAX)的用法?为什么?如果您想停止使用数据类型的人,请停止使用(n)text和image。但是,严肃地说,您不能停止使用数据类型。也许您可以使用DDL触发器获得“聪明”,但我建议您不要这样做。要回答编辑,不能使用sp_tableoption来阻止使用MAX长度数据类型no的人;我的上述观点仍然有效。引用文档(表选项(Transact-SQL) -参数:行外的大值类型):
表中的1= varchar(max)、nvarchar(max)、varbinary(max)、xml和大型用户定义类型(UDT)列存储在行外,并带有指向根的16字节指针。
0= varchar(max)、nvarchar(max)、varbinary(max)、xml和较大的UDT值直接存储在数据行中,最多可存储8000字节,并且只要该值适合记录。如果值不适合记录,指针将存储在行中,其余的则存储在LOB存储空间中的行外。0是默认值。
大用户定义类型(UDT)适用于: Server 2008到Server 2017.
使用TEXTIMAGE_ON选项CREATE TABLE指定存储大型数据类型的位置。
https://stackoverflow.com/questions/55415146
复制相似问题