SO和其他网站上有多个帖子,明确指出nvarchar(max)
的最大长度为2GB。但是,我在互联网和现实生活中也看到很多混乱,它实际上是Unicode中的8000/4000。
我想知道什么事情可以改变这个事实,或者可能导致某人错误地假设。
我已经收集了一些建议/部分答案:
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')
与此有什么关系吗?
澄清:我的目标不是使用此功能,而是要注意它的存在,这可能确实已被更高权限的用户使用,这将阻止我使用最大大小。这里有几点,因为我不能适应评论。
(n)varchar(MAX)
是introduced in SQL 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个字符的字符串.+ (String Concatenation) (Transact-SQL) - Remarks:
如果字符串串联的结果超过8,000字节的限制,则结果将被截断。但是,如果连接的至少一个字符串是大值类型,则不会发生截断。(n)varchar(MAX)
的用法?为什么?如果你想阻止使用数据类型的人停止使用(n)text
和image
。但是,严肃地说,您无法停止使用数据类型。也许你可以用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_ON
的CREATE TABLE
选项指定存储大型数据类型的位置。