SQL Server中的NVARCHAR(MAX)大小

Sha*_*nda 4 sql sql-server sql-server-2005 sql-server-2008

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

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

gbn*_*gbn 11

  1. 你有nvarchar(4000)或nvarchar(max).介于两者之间
  2. 索引键列的最大长度一起为900字节,因此您不能索引nvarchar(4000)(即8000字节)

就个人而言,我不明白为什么你需要索引nvarchar(max).
你是否真的要搜索长达1GB的字符串?

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

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

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

SQL Server 2016代码示例也强制执行唯一性
SHA2_512哈希提供最少的冲突机会.对于足够大的表,像MD4这样较弱的哈希会遇到生日问题

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
Run Code Online (Sandbox Code Playgroud)

请注意,您不能进行LIKE搜索.只有=<>

  • 只是我的想法:)很棒的答案 (2认同)