Geo*_*tis 7 t-sql sql-server nvarchar
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
Run Code Online (Sandbox Code Playgroud)有办法禁用该功能吗?与此有sp_tableoption @OptionName=large value types out of row
或OBJECTPROPERTY(id,'TableTextInRowLimit')
有什么关系吗?
澄清:我的目的不是使用此功能,而是要注意它的存在,它可能确实已被更高权限的用户使用,这将阻止我使用最大大小。
如有任何其他观点欢迎
这里有几点,因为我无法发表评论。
(n)varchar(MAX)
是在 SQL Server 2005 中引入的。以前您必须使用text
、ntext
和image
for 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;我的上述观点成立。引用文档( s p_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
指定大型数据类型的存储位置。
归档时间: |
|
查看次数: |
14386 次 |
最近记录: |