SQL Server中的NVARCHAR(MAX)大小

时间:2017-12-08 07:17:06

标签: sql sql-server sql-server-2008 sql-server-2005

当我将列定义为NVARCHAR(MAX)时,我无法索引该列。但我当然无法将列定义为NVARCHAR(4000),因为我假设数据字符串有时会更长。

有人可以建议如何使用NVARCHAR(MAX)数据定义对列进行索引,还是可以将长度从4000增加到更多?

1 个答案:

答案 0 :(得分:10)

  1. 您有nvarchar(4000)或nvarchar(max)。
  2. 之间没有任何内容
  3. 索引键列的最大长度为900字节,因此您无法索引nvarchar(4000)(即8000字节)
  4. 就个人而言,我不明白为什么你需要索引nvarchar(max) 您是否真的要搜索长达1GB的字符串?

    无论如何,您唯一的选择是在持久计算列中使用HASHBYTES 您创建列的哈希,并索引HASH。

    注意,取决于您可能无法散列nvarchar(max)的版本

      

    对于SQL Server 2014及更早版本,允许的输入值限制为8000字节。

    SQL Server 2016代码示例也强制执行唯一性 SHA2_512哈希提供最小的冲突机会。对于足够大的表格,像MD4这样较弱的哈希值会达到birthday problem

    CREATE TABLE dbo.HashExample (
        SomeID int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
        SomeLongText nvarchar(MAX) NULL,
        SomeHash AS HASHBYTES('SHA2_512', SomeLongText) PERSISTED
    )
    GO
    CREATE UNIQUE INDEX UX_SomeHash ON dbo.HashExample(SomeHash) WHERE SomeLongText IS NULL
    GO
    
    INSERT dbo.HashExample (SomeLongText) VALUES ('Row 1'), ('Row 2')
    GO
    SELECT * FROM dbo.HashExample
    GO
    
    DECLARE @LookFor nvarchar(MAX) = 'Row 3'
    SELECT * FROM dbo.HashExample WHERE SomeHash = HASHBYTES('SHA2_512', @LookFor)
    SET @LookFor = 'Row 2'
    SELECT * FROM dbo.HashExample WHERE SomeHash = HASHBYTES('SHA2_512', @LookFor)
    GO
    

    注意,您无法进行LIKE搜索。仅限=<>