gpt4 book ai didi

sql-server - 什么时候 nvarchar(Max) = nvarchar(4000)?

转载 作者:行者123 更新时间:2023-12-01 02:40:20 25 4
gpt4 key购买 nike

SO 和其他网站上都有多个帖子明确指出 nvarchar(max) 的最大长度是 2GB。但是,我在互联网和现实生活中也看到很多困惑,它实际上是 Unicode 中的 8000/4000。

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

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

  • 是否有仅支持最多 4000 个的较旧 SQL Server 版本?
  • 分配时 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 rowOBJECTPROPERTY(id,'TableTextInRowLimit')跟这个有关系吗?

    澄清 :我的目标不是使用这个功能,而是要注意它的存在,它可能确实被更高权限的用户使用,这将阻止我使用最大大小。
  • 任何其他点很高兴欢迎
  • 最佳答案

    这里有几点,因为我无法发表评论。

  • 是的。 (n)varchar(MAX)introduced in SQL Server 2005 .以前您必须使用 text , ntextimagevarchar(MAX) , nvarchar(MAX)varbinary(MAX) .旧的数据类型已经被弃用了很长时间,你不应该使用它们。
  • 合并数据时,data type precedence用于计算最终的数据类型。当涉及长度时,使用长度的组合值(A 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 :

    If the result of the concatenation of strings exceeds the limit of 8,000 bytes, the result is truncated. However, if at least one of the strings concatenated is a large value type, truncation does not occur.

  • 禁用什么功能? (n)varchar(MAX)的用法?为什么?如果您想阻止人们使用数据类型,请使用 (n)text 阻止他们和 image .但是,严肃地说,您无法停止使用数据类型。也许您可以使用 DDL 触发器变得“聪明”,但我建议不要这样做。
    要回答编辑,sp_tableoption不能用来阻止某人使用 MAX长度数据类型没有;我的上述观点成立。引用文档( sp_tableoption (Transact-SQL) - Arguments :

    Large value types out of row:
    1 = varchar(max), nvarchar(max), varbinary(max), xml and large user-defined type (UDT) columns in the table are stored out of row, with a 16-byte pointer to the root.

    0 = varchar(max), nvarchar(max), varbinary(max), xml and large UDT values are stored directly in the data row, up to a limit of 8000 bytes and as long as the value can fit in the record. If the value does not fit in the record, a pointer is stored in-row and the rest is stored out of row in the LOB storage space. 0 is the default value.

    Large user-defined type (UDT) applies to: SQL Server 2008 through SQL Server 2017.

    Use the TEXTIMAGE_ON option of CREATE TABLE to specify a location for storage of large data types.

  • 对 SO 来说太宽泛了。
  • 关于sql-server - 什么时候 nvarchar(Max) = nvarchar(4000)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415146/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com